@sebbo2002/tgtg-ical 3.1.4-develop.1 → 3.1.4-develop.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,5 +56,5 @@ model Mail {
56
56
  createdAt DateTime @default(now())
57
57
  erroredAt DateTime?
58
58
  }
59
- `,runtimeDataModel:{models:{},enums:{},types:{}},parameterizationSchema:{strings:[],graph:""}};y.runtimeDataModel=JSON.parse('{"models":{"User":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"prefix","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"lastSeenAt","kind":"scalar","type":"DateTime"},{"name":"event","kind":"object","type":"Event","relationName":"EventToUser"}],"dbName":null},"Event":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"orderId","kind":"scalar","type":"String"},{"name":"from","kind":"scalar","type":"DateTime"},{"name":"to","kind":"scalar","type":"DateTime"},{"name":"amount","kind":"scalar","type":"Int"},{"name":"price","kind":"scalar","type":"Int"},{"name":"user","kind":"object","type":"User","relationName":"EventToUser"},{"name":"userId","kind":"scalar","type":"String"},{"name":"location","kind":"object","type":"Location","relationName":"EventToLocation"},{"name":"locationId","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"orderedAt","kind":"scalar","type":"DateTime"},{"name":"invoicedAt","kind":"scalar","type":"DateTime"},{"name":"canceledAt","kind":"scalar","type":"DateTime"}],"dbName":null},"Location":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"name","kind":"scalar","type":"String"},{"name":"address","kind":"scalar","type":"String"},{"name":"latitude","kind":"scalar","type":"Float"},{"name":"longitude","kind":"scalar","type":"Float"},{"name":"emoji","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"event","kind":"object","type":"Event","relationName":"EventToLocation"}],"dbName":null},"Mail":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"raw","kind":"scalar","type":"String"},{"name":"error","kind":"scalar","type":"String"},{"name":"errorId","kind":"scalar","type":"String"},{"name":"version","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"erroredAt","kind":"scalar","type":"DateTime"}],"dbName":null}},"enums":{},"types":{}}');y.parameterizationSchema={strings:JSON.parse('["where","orderBy","cursor","user","event","_count","location","User.findUnique","User.findUniqueOrThrow","User.findFirst","User.findFirstOrThrow","User.findMany","data","User.createOne","User.createMany","User.updateOne","User.updateMany","create","update","User.upsertOne","User.deleteOne","User.deleteMany","having","_min","_max","User.groupBy","User.aggregate","Event.findUnique","Event.findUniqueOrThrow","Event.findFirst","Event.findFirstOrThrow","Event.findMany","Event.createOne","Event.createMany","Event.updateOne","Event.updateMany","Event.upsertOne","Event.deleteOne","Event.deleteMany","_avg","_sum","Event.groupBy","Event.aggregate","Location.findUnique","Location.findUniqueOrThrow","Location.findFirst","Location.findFirstOrThrow","Location.findMany","Location.createOne","Location.createMany","Location.updateOne","Location.updateMany","Location.upsertOne","Location.deleteOne","Location.deleteMany","Location.groupBy","Location.aggregate","Mail.findUnique","Mail.findUniqueOrThrow","Mail.findFirst","Mail.findFirstOrThrow","Mail.findMany","Mail.createOne","Mail.createMany","Mail.updateOne","Mail.updateMany","Mail.upsertOne","Mail.deleteOne","Mail.deleteMany","Mail.groupBy","Mail.aggregate","AND","OR","NOT","id","raw","error","errorId","version","createdAt","erroredAt","equals","in","notIn","lt","lte","gt","gte","not","contains","startsWith","endsWith","search","name","address","latitude","longitude","emoji","every","some","none","orderId","from","to","amount","price","userId","locationId","orderedAt","invoicedAt","canceledAt","prefix","lastSeenAt","is","isNot","_relevance","connectOrCreate","upsert","createMany","set","disconnect","delete","connect","updateMany","deleteMany","increment","decrement","multiply","divide"]'),graph:"zAEfOAgEAAB7ACBHAACBAQAwSAAACwAQSQAAgQEAMEoBAAAAAU9AAHMAIW8BAAAAAXBAAHMAIQEAAAABACARAwAAhAEAIAYAAIUBACBHAACCAQAwSAAAAwAQSQAAggEAMEoBAHEAIU9AAHMAIWUBAHEAIWZAAHMAIWdAAHMAIWgCAIMBACFpAgCDAQAhagEAcQAhawEAcQAhbEAAcwAhbUAAdAAhbkAAdAAhBQMAAL4BACAGAAC_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_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_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"};async function O(o){let{Buffer:e}=await import("buffer"),t=e.from(o,"base64");return new WebAssembly.Module(t)}y.compilerWasm={getRuntime:async()=>await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.mjs"),getQueryCompilerWasmModule:async()=>{let{wasm:o}=await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.wasm-base64.mjs");return await O(o)},importName:"./query_compiler_fast_bg.js"};function P(){return x.getPrismaClient(y)}import*as a from"@prisma/client/runtime/client";var N=a.Extensions.getExtensionContext;var j={DbNull:a.NullTypes.DbNull,JsonNull:a.NullTypes.JsonNull,AnyNull:a.NullTypes.AnyNull};var $=a.makeStrictEnum({ReadUncommitted:"ReadUncommitted",ReadCommitted:"ReadCommitted",RepeatableRead:"RepeatableRead",Serializable:"Serializable"});var J=a.Extensions.defineExtension;globalThis.__dirname=U.dirname(b(import.meta.url));var T=P();var f=process.env.DATABASE_URL;if(!f)throw new Error("DATABASE_URL is not set");var u=new URL(f),R=new S({connectionLimit:5,database:u.pathname.slice(1),host:u.hostname,password:u.password,port:parseInt(u.port,10)||3306,user:u.username}),L=new T({adapter:R}),i=L;import{init as W}from"@sentry/node";import{readFileSync as V}from"fs";import{dirname as K,resolve as C}from"path";import{fileURLToPath as H}from"url";W({dsn:process.env.SENTRY_DSN||"https://5e4630d58e5f4c778ce22140c53b3684@glitch.sebbo.net/9"});var c=K(H(import.meta.url));c.endsWith("/dist")?c=C(c,"..","src"):c=C(c,"..");function M(o){return C(c,o||"")}var F;try{F=JSON.parse(V(M("../package.json"),"utf8")).version}catch(o){console.log("Failed getting tgtg-ical version:"),console.error(o)}var m={baseMail:process.env.BASE_MAIL||"@tgtg-ical.sebbo.net",baseUrl:process.env.BASE_URL||"https://tgtg-ical.sebbo.net",src:M,version:F};import{captureException as G}from"@sentry/node";import v from"he";import{simpleParser as Y}from"mailparser";import s from"moment-timezone";var h={"\u{1F32D}":[/Ikea/],"\u{1F32E}":[/Enchilada/,/Besitos/],"\u{1F354}":[/Burger/,/McDonald[‘|']?s/,/Burger King/,/Hans im Glück/,/Peter Pane/],"\u{1F355}":[/Domino‘s/,/Pizza Hut/,/L[‘|']Osteria/,/Call a Pizza/,/Smiley[‘|']s Pizza/],"\u{1F357}":[/KFC/],"\u{1F35D}":[/LaTagliatella/,/Vapiano/],"\u{1F364}":[/Nordsee/],"\u{1F369}":[/Donut/,/Dunkin/],"\u{1F36A}":[/Starbucks/],"\u{1F950}":[/LeCroBag/],"\u{1F956}":[/Bäckerei/,/Back/,/BackWerk/,/Kamps/,/Kamps Backstuben/,/Junge Die Bäckerei/,/Back-Factory/],"\u{1F957}":[/dean ?& ?david/],"\u{1F968}":[/Brezel/,/Ditsch/],"\u{1F969}":[/Steakhouse/,/Block House/,/Jim Block/],"\u{1F96A}":[/Sandwich/,/Tank ?& ?Rast/,/T&R Raststätten/,/Autohöfe/,/Aral/,/Shell/,/Jet Tank/,/Subway/,/Caf[é|e] bonjour/,/Total Deutschland/,/Esso:? Snack ?& ?Shop/],"\u{1F6D2}":[/Edeka/,/Netto/,/Rewe/,/Penny/,/Lidl/,/Kaufland/,/Aldi/,/dm/,/Rossmann/,/Globus/,/Metro/,/Norma/,/Tegut/]};function I(o){for(let e in h)if(!!h[e].map(r=>new RegExp(r,"i")).find(r=>r.test(o)))return e;return null}var Q=class{static async geocode(e){let t=await fetch("https://nominatim.openstreetmap.org/search?format=json&limit=1&q="+encodeURIComponent(e),{headers:{Referer:m.baseUrl,"User-Agent":`tgtg-ical/${m.version} (${m.baseUrl})`}});if(!t.ok)throw new Error("Geocoding failed: "+t.statusText);await new Promise(r=>setTimeout(r,1e3));let A=await t.json();return!Array.isArray(A)||A.length===0?{latitude:null,longitude:null}:{latitude:parseFloat(A[0].lat),longitude:parseFloat(A[0].lon)}}static async handleMail(e){try{let t=await this.parseMail(e.raw);t&&await this.applyParsedMail(t),await i.mail.delete({where:{id:e.id}})}catch(t){let A=G(t);await i.mail.update({data:{error:t instanceof Error?t.stack:String(t),erroredAt:new Date,errorId:A,version:m.version},where:{id:e.id}})}}static async inhaleMail(e){let t=await i.mail.create({data:{raw:e}});await this.handleMail(t)}static async parseMail(e,t=m.baseMail){let A=await Y(e,{skipHtmlToText:!0,skipImageLinks:!0,skipTextLinks:!0,skipTextToHtml:!0});if(!A.from?.value[0].address?.endsWith("toogoodtogo.com"))throw new Error("Not a TGTG email!");let r=(Array.isArray(A.to)?A.to:[A.to]).map(n=>n?.value).flat().filter(n=>!!n).map(n=>n.address).find(n=>n?.endsWith(t));if(!r){let n=A.headers.get("received"),d=new RegExp(`([\\w-]+${m.baseMail})`,"i");Array.isArray(n)&&n.forEach(l=>{let g=(typeof l=="string"?l:l.value).match(d);g&&(r=g[1])})}if(!r)throw new Error("No recipient found!");if(A.headers.get("x-pm-tag")==="consumer_order_confirm"){let n=this.parseOrderMail(A);return{to:r,...n}}if(A.headers.get("x-pm-tag")==="collection_time_changed"){let n=this.parseChangeMail(A);return{to:r,...n}}if(A.headers.get("x-pm-tag")==="consumer_order_reverted"){let n=this.parseCancellationMail(A);if(n)return{to:r,...n}}if(A.headers.get("x-pm-tag")==="invoice"){let n=this.parseInvoiceMail(A);if(n)return{to:r,...n}}if(!(!A.headers.get("x-pm-tag")&&!A.headers.get("x-pm-message-id")))throw A.headers.get("x-pm-tag")?new Error(`Unsupported email type: ${A.headers.get("x-pm-tag")}`):new Error("Not implemented!")}static async runCleanup(){let e=await i.mail.findMany({orderBy:{erroredAt:"asc"},take:10,where:{OR:[{error:null},{version:null},{version:{not:m.version}}]}});for(let A of e)await this.handleMail(A);let t=await i.user.findMany({orderBy:{lastSeenAt:"asc"},where:{OR:[{lastSeenAt:{lt:s().subtract(8,"weeks").toDate()}},{createdAt:{lt:s().subtract(3,"hours").toDate()},lastSeenAt:{equals:i.user.fields.createdAt}}]}});for(let A of t)await i.user.delete({where:{id:A.id}});await i.event.deleteMany({where:{to:{lt:s().subtract(4,"weeks").toDate()}}}),await i.mail.deleteMany({where:{createdAt:{lt:s().subtract(2,"weeks").toDate()}}})}static async applyParsedMail(e){let t=await this.findUser(e.to);if(e.type==="order"){let A=await this.getLocation(e.location);await i.event.upsert({create:{amount:e.amount,from:e.time.from.toDate(),location:{connect:{id:A.id}},orderedAt:e.time.order.toDate(),orderId:e.orderId,price:e.price,to:e.time.to.toDate(),user:{connect:{id:t.id}}},update:{amount:e.amount,from:e.time.from.toDate(),location:{connect:{id:A.id}},price:e.price,to:e.time.to.toDate()},where:{orderId:e.orderId,userId:t.id}})}else if(e.type==="change")await i.event.update({data:{from:e.time.from.toDate(),to:e.time.to.toDate()},where:{orderId:e.orderId,userId:t.id}});else if(e.type==="cancel")await i.event.update({data:{canceledAt:e.cancelledAt.toDate()},where:{orderId:e.orderId,userId:t.id}});else if(e.type==="invoice")await i.event.update({data:{invoicedAt:e.invoicedAt.toDate()},where:{orderId:e.orderId,userId:t.id}});else throw new Error("Unknown email type!")}static async findUser(e){if(!e)throw new Error("Did not found a valid recipient!");let t=e.split("@")[0],A=await i.user.findUnique({where:{prefix:t}});if(!A)throw new Error(`User with email prefix ${t} not found!`);return A}static async getLocation(e){let t=await i.location.findFirst({where:{address:e.address,name:e.name}});if(!t){let A=I(e.name),{latitude:r,longitude:n}=await this.geocode(e.address);t=await i.location.create({data:{address:e.address,emoji:A,latitude:r,longitude:n,name:e.name}})}return t}static parseCancellationMail(e){let A=(e.subject||"").match(/\((\w+)\)/);if(A)return{cancelledAt:s(e.date),orderId:A[1],type:"cancel"}}static parseChangeMail(e){let t=[(e.html||"").match(/https:\/\/share.toogoodtogo.com\/receipts\/details\/(\w+)/),(e.html||"").match(/(\d{1,2}\.\d{2}\.\d{2}) zwischen (\d{1,2}:\d{2}) und (\d{1,2}:\d{2})(?: Uhr)? (\w+)+ \(/)];if(!t[0])throw new Error("Order ID not found!");if(!t[1])throw new Error("Date / Time not found!");let A=t[1][4];A==="MEZ"&&(A="MET");let r=s.tz(t[1][1]+" "+t[1][2],"DD.MM.YY HH:mm",A),n=s.tz(t[1][1]+" "+t[1][3],"DD.MM.YY HH:mm",A);return{orderId:t[0][1].trim(),time:{from:r,to:n},type:"change"}}static parseInvoiceMail(e){let A=(e.html||"").match(/Die Rechnung für deine Bestellung (\w+)/);if(A)return{invoicedAt:s(e.date),orderId:A[1],type:"invoice"};throw new Error("Order Id not found!")}static parseOrderMail(e){let t=e.html||"",A=[t.match(/\/order\/([^/]+)\//),t.match(/Wir bestätigen hiermit deine Bestellung bei ([^(.<]+)/),t.match(/<span>Du kannst deine Bestellung am (\d{1,2}\.\d{2}\.\d{2}) zwischen (\d{1,2}:\d{2}) und (\d{1,2}:\d{2}) Uhr (\w+)[^:]+: (.+).<\/span><\/div>/),t.match(/<span>Du kannst deine Bestellung zwischen (\d{1,2}\.\d{1,2}), (\d{1,2}:\d{2}) und (\d{1,2}:\d{2})[^:]+: (.+).<\/span><\/div>/),t.match(/<b>Datum:<\/b>\s+<span>(\d{1,2}\.\d{2}\.\d{2})<\/span>/),t.match(/Abholzeit:<\/b>\s+<span>(\d{1,2}:\d{2}) - (\d{1,2}:\d{2}) (\w+)/),t.match(/Anzahl: (\d+)/),t.match(/Anzahl:<\/b>\s+<span>(\d+)/),t.match(/Gesamtpreis: ([\d,.]+)[^\d,.]/),t.match(/Gesamtpreis:<\/b>\s+<span>([\d,.]+)[^\d,.]/),t.match(/Standort:<\/b>\s+<span>([^<]+)/)];if(!A[0])throw new Error("Order ID not found!");if(!A[1])throw new Error("Location name not found!");if(!A[2]&&!A[3]&&!(A[4]&&A[5]))throw new Error("Date, time and address not found (1)!");let r="MET";A[2]&&(r=A[2][4]),A[5]&&(r=A[5][3]),r==="MEZ"&&(r="MET");let n=s(e.date),d,l,p;if(A[2]&&(d=s.tz(A[2][1]+" "+A[2][2],"DD.MM.YY HH:mm",r),l=s.tz(A[2][1]+" "+A[2][3],"DD.MM.YY HH:mm",r),p=A[2][5].trim()),A[3]){let w=n.year();d=s.tz(A[3][1]+"."+w+" "+A[3][2],"DD.MM.YYYY HH:mm",r),l=s.tz(A[3][1]+"."+w+" "+A[3][3],"DD.MM.YYYY HH:mm",r),p=A[3][4].trim(),d.isBefore(n)&&d.add(1,"year"),l.isBefore(d)&&l.add(1,"year")}if(A[4]&&A[5]&&A[10]&&(d=s.tz(A[4][1]+" "+A[5][1],"DD.MM.YY HH:mm",r),l=s.tz(A[4][1]+" "+A[5][2],"DD.MM.YY HH:mm",r),p=A[10][1].trim()),!d||!l||!p)throw new Error("Date, time or address not found (2)!");let g=0;if(A[6])g=parseInt(A[6][1],10);else if(A[7])g=parseInt(A[7][1],10);else throw new Error("Amount not found!");if(isNaN(g))throw new Error("Amount (1) is not a number!");let E=0;if(A[8])E=parseInt(A[8][1].replace(/[.|,]/g,""));else if(A[9])E=parseInt(A[9][1].replace(/[.|,]/g,""));else throw new Error("Price not found!");if(isNaN(E))throw new Error("Price is not a number!");let B=v.decode(A[1][1].trim());return B.endsWith("!")&&(B=B.slice(0,-1)),{amount:g,location:{address:v.decode(p),name:B},orderId:A[0][1].trim(),price:E,time:{from:d,order:n,to:l},type:"order"}}};export{i as a,m as b,Q as c};
60
- //# sourceMappingURL=chunk-TSRRPL4X.js.map
59
+ `,runtimeDataModel:{models:{},enums:{},types:{}},parameterizationSchema:{strings:[],graph:""}};y.runtimeDataModel=JSON.parse('{"models":{"User":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"prefix","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"lastSeenAt","kind":"scalar","type":"DateTime"},{"name":"event","kind":"object","type":"Event","relationName":"EventToUser"}],"dbName":null},"Event":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"orderId","kind":"scalar","type":"String"},{"name":"from","kind":"scalar","type":"DateTime"},{"name":"to","kind":"scalar","type":"DateTime"},{"name":"amount","kind":"scalar","type":"Int"},{"name":"price","kind":"scalar","type":"Int"},{"name":"user","kind":"object","type":"User","relationName":"EventToUser"},{"name":"userId","kind":"scalar","type":"String"},{"name":"location","kind":"object","type":"Location","relationName":"EventToLocation"},{"name":"locationId","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"orderedAt","kind":"scalar","type":"DateTime"},{"name":"invoicedAt","kind":"scalar","type":"DateTime"},{"name":"canceledAt","kind":"scalar","type":"DateTime"}],"dbName":null},"Location":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"name","kind":"scalar","type":"String"},{"name":"address","kind":"scalar","type":"String"},{"name":"latitude","kind":"scalar","type":"Float"},{"name":"longitude","kind":"scalar","type":"Float"},{"name":"emoji","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"event","kind":"object","type":"Event","relationName":"EventToLocation"}],"dbName":null},"Mail":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"raw","kind":"scalar","type":"String"},{"name":"error","kind":"scalar","type":"String"},{"name":"errorId","kind":"scalar","type":"String"},{"name":"version","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"erroredAt","kind":"scalar","type":"DateTime"}],"dbName":null}},"enums":{},"types":{}}');y.parameterizationSchema={strings:JSON.parse('["where","orderBy","cursor","user","event","_count","location","User.findUnique","User.findUniqueOrThrow","User.findFirst","User.findFirstOrThrow","User.findMany","data","User.createOne","User.createMany","User.updateOne","User.updateMany","create","update","User.upsertOne","User.deleteOne","User.deleteMany","having","_min","_max","User.groupBy","User.aggregate","Event.findUnique","Event.findUniqueOrThrow","Event.findFirst","Event.findFirstOrThrow","Event.findMany","Event.createOne","Event.createMany","Event.updateOne","Event.updateMany","Event.upsertOne","Event.deleteOne","Event.deleteMany","_avg","_sum","Event.groupBy","Event.aggregate","Location.findUnique","Location.findUniqueOrThrow","Location.findFirst","Location.findFirstOrThrow","Location.findMany","Location.createOne","Location.createMany","Location.updateOne","Location.updateMany","Location.upsertOne","Location.deleteOne","Location.deleteMany","Location.groupBy","Location.aggregate","Mail.findUnique","Mail.findUniqueOrThrow","Mail.findFirst","Mail.findFirstOrThrow","Mail.findMany","Mail.createOne","Mail.createMany","Mail.updateOne","Mail.updateMany","Mail.upsertOne","Mail.deleteOne","Mail.deleteMany","Mail.groupBy","Mail.aggregate","AND","OR","NOT","id","raw","error","errorId","version","createdAt","erroredAt","equals","in","notIn","lt","lte","gt","gte","not","contains","startsWith","endsWith","search","name","address","latitude","longitude","emoji","every","some","none","orderId","from","to","amount","price","userId","locationId","orderedAt","invoicedAt","canceledAt","prefix","lastSeenAt","is","isNot","_relevance","connectOrCreate","upsert","createMany","set","disconnect","delete","connect","updateMany","deleteMany","increment","decrement","multiply","divide"]'),graph:"zAEfOAgEAAB7ACBHAACBAQAwSAAACwAQSQAAgQEAMEoBAAAAAU9AAHMAIW8BAAAAAXBAAHMAIQEAAAABACARAwAAhAEAIAYAAIUBACBHAACCAQAwSAAAAwAQSQAAggEAMEoBAHEAIU9AAHMAIWUBAHEAIWZAAHMAIWdAAHMAIWgCAIMBACFpAgCDAQAhagEAcQAhawEAcQAhbEAAcwAhbUAAdAAhbkAAdAAhBQMAAL4BACAGAAC_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_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_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"};async function O(o){let{Buffer:e}=await import("buffer"),t=e.from(o,"base64");return new WebAssembly.Module(t)}y.compilerWasm={getRuntime:async()=>await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.mjs"),getQueryCompilerWasmModule:async()=>{let{wasm:o}=await import("@prisma/client/runtime/query_compiler_fast_bg.mysql.wasm-base64.mjs");return await O(o)},importName:"./query_compiler_fast_bg.js"};function P(){return x.getPrismaClient(y)}import*as a from"@prisma/client/runtime/client";var N=a.Extensions.getExtensionContext;var j={DbNull:a.NullTypes.DbNull,JsonNull:a.NullTypes.JsonNull,AnyNull:a.NullTypes.AnyNull};var $=a.makeStrictEnum({ReadUncommitted:"ReadUncommitted",ReadCommitted:"ReadCommitted",RepeatableRead:"RepeatableRead",Serializable:"Serializable"});var J=a.Extensions.defineExtension;globalThis.__dirname=U.dirname(b(import.meta.url));var T=P();var f=process.env.DATABASE_URL;if(!f)throw new Error("DATABASE_URL is not set");var c=new URL(f),R=new S({connectionLimit:5,database:c.pathname.slice(1),host:c.hostname,password:c.password,port:parseInt(c.port,10)||3306,user:c.username}),L=new T({adapter:R}),i=L;import{init as W}from"@sentry/node";import{readFileSync as V}from"fs";import{dirname as K,resolve as C}from"path";import{fileURLToPath as H}from"url";W({dsn:process.env.SENTRY_DSN||"https://5e4630d58e5f4c778ce22140c53b3684@glitch.sebbo.net/9"});var u=K(H(import.meta.url));u.endsWith("/dist")?u=C(u,"..","src"):u=C(u,"..");function M(o){return C(u,o||"")}var F;try{F=JSON.parse(V(M("../package.json"),"utf8")).version}catch(o){console.log("Failed getting tgtg-ical version:"),console.error(o)}var m={baseMail:process.env.BASE_MAIL||"@tgtg-ical.sebbo.net",baseUrl:process.env.BASE_URL||"https://tgtg-ical.sebbo.net",src:M,version:F};import{captureException as G}from"@sentry/node";import v from"he";import{simpleParser as Y}from"mailparser";import s from"moment-timezone";var h={"\u{1F32D}":[/Ikea/],"\u{1F32E}":[/Enchilada/,/Besitos/],"\u{1F354}":[/Burger/,/McDonald[‘|']?s/,/Burger King/,/Hans im Glück/,/Peter Pane/],"\u{1F355}":[/Domino‘s/,/Pizza Hut/,/L[‘|']Osteria/,/Call a Pizza/,/Smiley[‘|']s Pizza/],"\u{1F357}":[/KFC/],"\u{1F35D}":[/LaTagliatella/,/Vapiano/],"\u{1F364}":[/Nordsee/],"\u{1F369}":[/Donut/,/Dunkin/],"\u{1F36A}":[/Starbucks/],"\u{1F950}":[/LeCroBag/],"\u{1F956}":[/Bäckerei/,/Back/,/BackWerk/,/Kamps/,/Kamps Backstuben/,/Junge Die Bäckerei/,/Back-Factory/],"\u{1F957}":[/dean ?& ?david/],"\u{1F968}":[/Brezel/,/Ditsch/],"\u{1F969}":[/Steakhouse/,/Block House/,/Jim Block/],"\u{1F96A}":[/Sandwich/,/Tank ?& ?Rast/,/T&R Raststätten/,/Autohöfe/,/Aral/,/Shell/,/Jet Tank/,/Subway/,/Caf[é|e] bonjour/,/Total Deutschland/,/Esso:? Snack ?& ?Shop/],"\u{1F6D2}":[/Edeka/,/Netto/,/Rewe/,/Penny/,/Lidl/,/Kaufland/,/Aldi/,/dm/,/Rossmann/,/Globus/,/Metro/,/Norma/,/Tegut/]};function I(o){for(let e in h)if(!!h[e].map(r=>new RegExp(r,"i")).find(r=>r.test(o)))return e;return null}var Q=class{static async geocode(e){let t=await fetch("https://nominatim.openstreetmap.org/search?format=json&limit=1&q="+encodeURIComponent(e),{headers:{Referer:m.baseUrl,"User-Agent":`tgtg-ical/${m.version} (${m.baseUrl})`}});if(!t.ok)throw new Error("Geocoding failed: "+t.statusText);await new Promise(r=>setTimeout(r,1e3));let A=await t.json();return!Array.isArray(A)||A.length===0?{latitude:null,longitude:null}:{latitude:parseFloat(A[0].lat),longitude:parseFloat(A[0].lon)}}static async handleMail(e){try{let t=await this.parseMail(e.raw);t&&await this.applyParsedMail(t),await i.mail.delete({where:{id:e.id}})}catch(t){let A=G(t);await i.mail.update({data:{error:t instanceof Error?t.stack:String(t),erroredAt:new Date,errorId:A,version:m.version},where:{id:e.id}})}}static async inhaleMail(e){let t=await i.mail.create({data:{raw:e}});await this.handleMail(t)}static async parseMail(e,t=m.baseMail){let A=await Y(e,{skipHtmlToText:!0,skipImageLinks:!0,skipTextLinks:!0,skipTextToHtml:!0});if(!A.from?.value[0].address?.endsWith("toogoodtogo.com"))throw new Error("Not a TGTG email!");let r=(Array.isArray(A.to)?A.to:[A.to]).map(n=>n?.value).flat().filter(n=>!!n).map(n=>n.address).find(n=>n?.endsWith(t));if(!r){let n=A.headers.get("received"),d=new RegExp(`([\\w-]+${m.baseMail})`,"i");Array.isArray(n)&&n.forEach(l=>{let g=(typeof l=="string"?l:l.value).match(d);g&&(r=g[1])})}if(!r)throw new Error("No recipient found!");if(A.headers.get("x-pm-tag")==="consumer_order_confirm"){let n=this.parseOrderMail(A);return{to:r,...n}}if(A.headers.get("x-pm-tag")==="collection_time_changed"){let n=this.parseChangeMail(A);return{to:r,...n}}if(A.headers.get("x-pm-tag")==="consumer_order_reverted"){let n=this.parseCancellationMail(A);if(n)return{to:r,...n}}if(A.headers.get("x-pm-tag")==="invoice"){let n=this.parseInvoiceMail(A);if(n)return{to:r,...n}}if(!(!A.headers.get("x-pm-tag")&&!A.headers.get("x-pm-message-id")))throw A.headers.get("x-pm-tag")?new Error(`Unsupported email type: ${A.headers.get("x-pm-tag")}`):new Error("Not implemented!")}static async runCleanup(){let e=await i.mail.findMany({orderBy:{erroredAt:"asc"},take:10,where:{OR:[{error:null},{version:null},{version:{not:m.version}}]}});for(let A of e)await this.handleMail(A);let t=await i.user.findMany({orderBy:{lastSeenAt:"asc"},where:{OR:[{lastSeenAt:{lt:s().subtract(8,"weeks").toDate()}},{createdAt:{lt:s().subtract(3,"hours").toDate()},lastSeenAt:{equals:i.user.fields.createdAt}}]}});for(let A of t)await i.user.delete({where:{id:A.id}});await i.event.deleteMany({where:{to:{lt:s().subtract(4,"weeks").toDate()}}}),await i.mail.deleteMany({where:{createdAt:{lt:s().subtract(2,"weeks").toDate()}}})}static async applyParsedMail(e){let t=await this.findUser(e.to);if(e.type==="order"){let A=await this.getLocation(e.location);await i.event.upsert({create:{amount:e.amount,from:e.time.from.toDate(),location:{connect:{id:A.id}},orderedAt:e.time.order.toDate(),orderId:e.orderId,price:e.price,to:e.time.to.toDate(),user:{connect:{id:t.id}}},update:{amount:e.amount,from:e.time.from.toDate(),location:{connect:{id:A.id}},price:e.price,to:e.time.to.toDate()},where:{orderId:e.orderId,userId:t.id}})}else if(e.type==="change")await i.event.update({data:{from:e.time.from.toDate(),to:e.time.to.toDate()},where:{orderId:e.orderId,userId:t.id}});else if(e.type==="cancel")await i.event.update({data:{canceledAt:e.cancelledAt.toDate()},where:{orderId:e.orderId,userId:t.id}});else if(e.type==="invoice")await i.event.update({data:{invoicedAt:e.invoicedAt.toDate()},where:{orderId:e.orderId,userId:t.id}});else throw new Error("Unknown email type!")}static async findUser(e){if(!e)throw new Error("Did not found a valid recipient!");let t=e.split("@")[0],A=await i.user.findUnique({where:{prefix:t}});if(!A)throw new Error(`User with email prefix ${t} not found!`);return A}static async getLocation(e){let t=await i.location.findFirst({where:{address:e.address,name:e.name}});if(!t){let A=I(e.name),{latitude:r,longitude:n}=await this.geocode(e.address);t=await i.location.create({data:{address:e.address,emoji:A,latitude:r,longitude:n,name:e.name}})}return t}static parseCancellationMail(e){let A=(e.subject||"").match(/\((\w+)\)/);if(A)return{cancelledAt:s(e.date),orderId:A[1],type:"cancel"}}static parseChangeMail(e){let t=[(e.html||"").match(/https:\/\/share.toogoodtogo.com\/receipts\/details\/(\w+)/),(e.html||"").match(/(\d{1,2}\.\d{2}\.\d{2}) zwischen (\d{1,2}:\d{2}) und (\d{1,2}:\d{2})(?: Uhr)? (\w+)+ \(/)];if(!t[0])throw new Error("Order ID not found!");if(!t[1])throw new Error("Date / Time not found!");let A=t[1][4];A==="MEZ"&&(A="MET");let r=s.tz(t[1][1]+" "+t[1][2],"DD.MM.YY HH:mm",A),n=s.tz(t[1][1]+" "+t[1][3],"DD.MM.YY HH:mm",A);return{orderId:t[0][1].trim(),time:{from:r,to:n},type:"change"}}static parseInvoiceMail(e){let A=(e.html||"").match(/Die Rechnung für deine Bestellung (\w+)/);if(A)return{invoicedAt:s(e.date),orderId:A[1],type:"invoice"};throw new Error("Order Id not found!")}static parseOrderMail(e){let t=e.html||"",A=[t.match(/\/order\/([^/]+)\//),t.match(/Wir bestätigen hiermit deine Bestellung bei ([^(.<]+)/),t.match(/<span>Du kannst deine Bestellung am (\d{1,2}\.\d{2}\.\d{2}) zwischen (\d{1,2}:\d{2}) und (\d{1,2}:\d{2}) Uhr (\w+)[^:]+: (.+).<\/span><\/div>/),t.match(/<span>Du kannst deine Bestellung zwischen (\d{1,2}\.\d{1,2}), (\d{1,2}:\d{2}) und (\d{1,2}:\d{2})[^:]+: (.+).<\/span><\/div>/),t.match(/<b>Datum:<\/b>\s+<span>(\d{1,2}\.\d{2}\.\d{2})<\/span>/),t.match(/Abholzeit:<\/b>\s+<span>(\d{1,2}:\d{2}) - (\d{1,2}:\d{2}) (\w+)/),t.match(/Anzahl: (\d+)/),t.match(/Anzahl:<\/b>\s+<span>(\d+)/),t.match(/Gesamtpreis: ([\d,.]+)[^\d,.]/),t.match(/Gesamtpreis:<\/b>\s+<span>([\d,.]+)[^\d,.]/),t.match(/Standort:<\/b>\s+<span>([^<]+)/)];if(!A[0])throw new Error("Order ID not found!");if(!A[1])throw new Error("Location name not found!");if(!A[2]&&!A[3]&&!(A[4]&&A[5]))throw new Error("Date, time and address not found (1)!");let r="MET";A[2]&&(r=A[2][4]),A[5]&&(r=A[5][3]),r==="MEZ"&&(r="MET");let n=s(e.date),d,l,p;if(A[2]&&(d=s.tz(A[2][1]+" "+A[2][2],"DD.MM.YY HH:mm",r),l=s.tz(A[2][1]+" "+A[2][3],"DD.MM.YY HH:mm",r),p=A[2][5].trim()),A[3]){let w=n.year();d=s.tz(A[3][1]+"."+w+" "+A[3][2],"DD.MM.YYYY HH:mm",r),l=s.tz(A[3][1]+"."+w+" "+A[3][3],"DD.MM.YYYY HH:mm",r),p=A[3][4].trim(),d.isBefore(n)&&d.add(1,"year"),l.isBefore(d)&&l.add(1,"year")}if(A[4]&&A[5]&&A[10]&&(d=s.tz(A[4][1]+" "+A[5][1],"DD.MM.YY HH:mm",r),l=s.tz(A[4][1]+" "+A[5][2],"DD.MM.YY HH:mm",r),p=A[10][1].trim()),!d||!l||!p)throw new Error("Date, time or address not found (2)!");let g;if(A[6])g=parseInt(A[6][1],10);else if(A[7])g=parseInt(A[7][1],10);else throw new Error("Amount not found!");if(isNaN(g))throw new Error("Amount (1) is not a number!");let E;if(A[8])E=parseInt(A[8][1].replace(/[.|,]/g,""));else if(A[9])E=parseInt(A[9][1].replace(/[.|,]/g,""));else throw new Error("Price not found!");if(isNaN(E))throw new Error("Price is not a number!");let B=v.decode(A[1][1].trim());return B.endsWith("!")&&(B=B.slice(0,-1)),{amount:g,location:{address:v.decode(p),name:B},orderId:A[0][1].trim(),price:E,time:{from:d,order:n,to:l},type:"order"}}};export{i as a,m as b,Q as c};
60
+ //# sourceMappingURL=chunk-6L6AXKMO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/db.ts","../src/prisma/prisma/client.ts","../src/prisma/prisma/internal/class.ts","../src/prisma/prisma/internal/prismaNamespace.ts","../src/lib/config.ts","../src/lib/parser.ts","../src/lib/emoji.ts"],"sourcesContent":["import { PrismaMariaDb } from '@prisma/adapter-mariadb';\n\nimport { PrismaClient } from '../prisma/prisma/client.js';\n\nconst databaseUrlStr = process.env.DATABASE_URL;\nif (!databaseUrlStr) {\n throw new Error('DATABASE_URL is not set');\n}\n\nconst databaseUrl = new URL(databaseUrlStr);\nconst prismaAdapter = new PrismaMariaDb({\n connectionLimit: 5,\n database: databaseUrl.pathname.slice(1),\n host: databaseUrl.hostname,\n password: databaseUrl.password,\n port: parseInt(databaseUrl.port, 10) || 3306,\n user: databaseUrl.username,\n});\nconst prisma = new PrismaClient({\n adapter: prismaAdapter,\n});\n\nexport default prisma;\nexport * from '../prisma/prisma/client.js';\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums.js\"\nimport * as $Class from \"./internal/class.js\"\nimport * as Prisma from \"./internal/prismaNamespace.js\"\n\nexport * as $Enums from './enums.js'\nexport * from \"./enums.js\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model User\n * \n */\nexport type User = Prisma.UserModel\n/**\n * Model Event\n * \n */\nexport type Event = Prisma.EventModel\n/**\n * Model Location\n * \n */\nexport type Location = Prisma.LocationModel\n/**\n * Model Mail\n * \n */\nexport type Mail = Prisma.MailModel\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace.js\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.4.0\",\n \"engineVersion\": \"ab56fe763f921d033a6c195e7ddeb3e255bdbb57\",\n \"activeProvider\": \"mysql\",\n \"inlineSchema\": \"// This is your Prisma schema file,\\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"./prisma\\\"\\n importFileExtension = \\\"js\\\"\\n}\\n\\ndatasource db {\\n provider = \\\"mysql\\\"\\n}\\n\\nmodel User {\\n id String @id @default(uuid())\\n prefix String @unique\\n createdAt DateTime @default(now())\\n lastSeenAt DateTime @default(now())\\n event Event[]\\n}\\n\\nmodel Event {\\n id String @id @default(uuid())\\n orderId String @unique\\n from DateTime\\n to DateTime\\n amount Int\\n price Int\\n user User @relation(fields: [userId], references: [id])\\n userId String\\n location Location @relation(fields: [locationId], references: [id])\\n locationId String\\n createdAt DateTime @default(now())\\n orderedAt DateTime\\n invoicedAt DateTime?\\n canceledAt DateTime?\\n}\\n\\nmodel Location {\\n id String @id @default(uuid())\\n name String\\n address String\\n latitude Float?\\n longitude Float?\\n emoji String? @db.VarChar(16)\\n createdAt DateTime @default(now())\\n event Event[]\\n}\\n\\nmodel Mail {\\n id String @id @default(uuid())\\n raw String @db.MediumText\\n error String? @db.MediumText\\n errorId String?\\n version String?\\n createdAt DateTime @default(now())\\n erroredAt DateTime?\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n },\n \"parameterizationSchema\": {\n \"strings\": [],\n \"graph\": \"\"\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"User\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"prefix\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"lastSeenAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"event\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Event\\\",\\\"relationName\\\":\\\"EventToUser\\\"}],\\\"dbName\\\":null},\\\"Event\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"orderId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"from\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"to\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"amount\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"price\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"EventToUser\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"location\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Location\\\",\\\"relationName\\\":\\\"EventToLocation\\\"},{\\\"name\\\":\\\"locationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"orderedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"invoicedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"canceledAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"Location\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"address\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"latitude\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Float\\\"},{\\\"name\\\":\\\"longitude\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Float\\\"},{\\\"name\\\":\\\"emoji\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"event\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Event\\\",\\\"relationName\\\":\\\"EventToLocation\\\"}],\\\"dbName\\\":null},\\\"Mail\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"raw\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"error\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"errorId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"version\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"erroredAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n strings: JSON.parse(\"[\\\"where\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"user\\\",\\\"event\\\",\\\"_count\\\",\\\"location\\\",\\\"User.findUnique\\\",\\\"User.findUniqueOrThrow\\\",\\\"User.findFirst\\\",\\\"User.findFirstOrThrow\\\",\\\"User.findMany\\\",\\\"data\\\",\\\"User.createOne\\\",\\\"User.createMany\\\",\\\"User.updateOne\\\",\\\"User.updateMany\\\",\\\"create\\\",\\\"update\\\",\\\"User.upsertOne\\\",\\\"User.deleteOne\\\",\\\"User.deleteMany\\\",\\\"having\\\",\\\"_min\\\",\\\"_max\\\",\\\"User.groupBy\\\",\\\"User.aggregate\\\",\\\"Event.findUnique\\\",\\\"Event.findUniqueOrThrow\\\",\\\"Event.findFirst\\\",\\\"Event.findFirstOrThrow\\\",\\\"Event.findMany\\\",\\\"Event.createOne\\\",\\\"Event.createMany\\\",\\\"Event.updateOne\\\",\\\"Event.updateMany\\\",\\\"Event.upsertOne\\\",\\\"Event.deleteOne\\\",\\\"Event.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"Event.groupBy\\\",\\\"Event.aggregate\\\",\\\"Location.findUnique\\\",\\\"Location.findUniqueOrThrow\\\",\\\"Location.findFirst\\\",\\\"Location.findFirstOrThrow\\\",\\\"Location.findMany\\\",\\\"Location.createOne\\\",\\\"Location.createMany\\\",\\\"Location.updateOne\\\",\\\"Location.updateMany\\\",\\\"Location.upsertOne\\\",\\\"Location.deleteOne\\\",\\\"Location.deleteMany\\\",\\\"Location.groupBy\\\",\\\"Location.aggregate\\\",\\\"Mail.findUnique\\\",\\\"Mail.findUniqueOrThrow\\\",\\\"Mail.findFirst\\\",\\\"Mail.findFirstOrThrow\\\",\\\"Mail.findMany\\\",\\\"Mail.createOne\\\",\\\"Mail.createMany\\\",\\\"Mail.updateOne\\\",\\\"Mail.updateMany\\\",\\\"Mail.upsertOne\\\",\\\"Mail.deleteOne\\\",\\\"Mail.deleteMany\\\",\\\"Mail.groupBy\\\",\\\"Mail.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"raw\\\",\\\"error\\\",\\\"errorId\\\",\\\"version\\\",\\\"createdAt\\\",\\\"erroredAt\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"search\\\",\\\"name\\\",\\\"address\\\",\\\"latitude\\\",\\\"longitude\\\",\\\"emoji\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"orderId\\\",\\\"from\\\",\\\"to\\\",\\\"amount\\\",\\\"price\\\",\\\"userId\\\",\\\"locationId\\\",\\\"orderedAt\\\",\\\"invoicedAt\\\",\\\"canceledAt\\\",\\\"prefix\\\",\\\"lastSeenAt\\\",\\\"is\\\",\\\"isNot\\\",\\\"_relevance\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"createMany\\\",\\\"set\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\"]\"),\n graph: \"zAEfOAgEAAB7ACBHAACBAQAwSAAACwAQSQAAgQEAMEoBAAAAAU9AAHMAIW8BAAAAAXBAAHMAIQEAAAABACARAwAAhAEAIAYAAIUBACBHAACCAQAwSAAAAwAQSQAAggEAMEoBAHEAIU9AAHMAIWUBAHEAIWZAAHMAIWdAAHMAIWgCAIMBACFpAgCDAQAhagEAcQAhawEAcQAhbEAAcwAhbUAAdAAhbkAAdAAhBQMAAL4BACAGAAC_AQAgbQAAhgEAIG4AAIYBACBzAADAAQAgEQMAAIQBACAGAACFAQAgRwAAggEAMEgAAAMAEEkAAIIBADBKAQAAAAFPQABzACFlAQAAAAFmQABzACFnQABzACFoAgCDAQAhaQIAgwEAIWoBAHEAIWsBAHEAIWxAAHMAIW1AAHQAIW5AAHQAIQMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAMAIAEAAAADACABAAAAAQAgCAQAAHsAIEcAAIEBADBIAAALABBJAACBAQAwSgEAcQAhT0AAcwAhbwEAcQAhcEAAcwAhAgQAAKYBACBzAAC9AQAgAwAAAAsAIAEAAAwAMAIAAAEAIAMAAAALACABAAAMADACAAABACADAAAACwAgAQAADAAwAgAAAQAgBQQAALwBACBKAQAAAAFPQAAAAAFvAQAAAAFwQAAAAAEBDAAAEAAgBEoBAAAAAU9AAAAAAW8BAAAAAXBAAAAAAQEMAAASADAFBAAAsgEAIEoBAIoBACFPQACMAQAhbwEAigEAIXBAAIwBACECAAAAAQAgDAAAFAAgBEoBAIoBACFPQACMAQAhbwEAigEAIXBAAIwBACECAAAACwAgDAAAFgAgAwAAAAEAIBEAABAAIBIAABQAIAEAAAABACABAAAACwAgAwUAAK8BACAXAACxAQAgGAAAsAEAIAdHAACAAQAwSAAAHAAQSQAAgAEAMEoBAGIAIU9AAGQAIW8BAGIAIXBAAGQAIQMAAAALACABAAAbADAWAAAcACADAAAACwAgAQAADAAwAgAAAQAgAQAAAAUAIAEAAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACAOAwAApAEAIAYAAK4BACBKAQAAAAFPQAAAAAFlAQAAAAFmQAAAAAFnQAAAAAFoAgAAAAFpAgAAAAFqAQAAAAFrAQAAAAFsQAAAAAFtQAAAAAFuQAAAAAEBDAAAJAAgDEoBAAAAAU9AAAAAAWUBAAAAAWZAAAAAAWdAAAAAAWgCAAAAAWkCAAAAAWoBAAAAAWsBAAAAAWxAAAAAAW1AAAAAAW5AAAAAAQEMAAAmADAOAwAAogEAIAYAAK0BACBKAQCKAQAhT0AAjAEAIWUBAIoBACFmQACMAQAhZ0AAjAEAIWgCAKABACFpAgCgAQAhagEAigEAIWsBAIoBACFsQACMAQAhbUAAjQEAIW5AAI0BACECAAAABQAgDAAAKAAgDEoBAIoBACFPQACMAQAhZQEAigEAIWZAAIwBACFnQACMAQAhaAIAoAEAIWkCAKABACFqAQCKAQAhawEAigEAIWxAAIwBACFtQACNAQAhbkAAjQEAIQIAAAADACAMAAAqACADAAAABQAgEQAAJAAgEgAAKAAgAQAAAAUAIAEAAAADACAHBQAAqAEAIBcAAKsBACAYAACqAQAgJwAAqQEAICgAAKwBACBtAACGAQAgbgAAhgEAIA9HAAB8ADBIAAAwABBJAAB8ADBKAQBiACFPQABkACFlAQBiACFmQABkACFnQABkACFoAgB9ACFpAgB9ACFqAQBiACFrAQBiACFsQABkACFtQABlACFuQABlACEDAAAAAwAgAQAALwAwFgAAMAAgAwAAAAMAIAEAAAQAMAIAAAUAIAsEAAB7ACBHAAB5ADBIAAA2ABBJAAB5ADBKAQAAAAFPQABzACFdAQBxACFeAQBxACFfCAB6ACFgCAB6ACFhAQByACEBAAAAMwAgAQAAADMAIAsEAAB7ACBHAAB5ADBIAAA2ABBJAAB5ADBKAQBxACFPQABzACFdAQBxACFeAQBxACFfCAB6ACFgCAB6ACFhAQByACEFBAAApgEAIF8AAIYBACBgAACGAQAgYQAAhgEAIHMAAKcBACADAAAANgAgAQAANwAwAgAAMwAgAwAAADYAIAEAADcAMAIAADMAIAMAAAA2ACABAAA3ADACAAAzACAIBAAApQEAIEoBAAAAAU9AAAAAAV0BAAAAAV4BAAAAAV8IAAAAAWAIAAAAAWEBAAAAAQEMAAA7ACAHSgEAAAABT0AAAAABXQEAAAABXgEAAAABXwgAAAABYAgAAAABYQEAAAABAQwAAD0AMAgEAACVAQAgSgEAigEAIU9AAIwBACFdAQCKAQAhXgEAigEAIV8IAJQBACFgCACUAQAhYQEAiwEAIQIAAAAzACAMAAA_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_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\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.mysql.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.mysql.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.user`: Exposes CRUD operations for the **User** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n */\n get user(): Prisma.UserDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.event`: Exposes CRUD operations for the **Event** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Events\n * const events = await prisma.event.findMany()\n * ```\n */\n get event(): Prisma.EventDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.location`: Exposes CRUD operations for the **Location** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Locations\n * const locations = await prisma.location.findMany()\n * ```\n */\n get location(): Prisma.LocationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.mail`: Exposes CRUD operations for the **Mail** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Mail\n * const mail = await prisma.mail.findMany()\n * ```\n */\n get mail(): Prisma.MailDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models.js\"\nimport { type PrismaClient } from \"./class.js\"\n\nexport type * from '../models.js'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.4.0\n * Query Engine version: ab56fe763f921d033a6c195e7ddeb3e255bdbb57\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.4.0\",\n engine: \"ab56fe763f921d033a6c195e7ddeb3e255bdbb57\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n User: 'User',\n Event: 'Event',\n Location: 'Location',\n Mail: 'Mail'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"user\" | \"event\" | \"location\" | \"mail\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n User: {\n payload: Prisma.$UserPayload<ExtArgs>\n fields: Prisma.UserFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n findFirst: {\n args: Prisma.UserFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n findMany: {\n args: Prisma.UserFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]\n }\n create: {\n args: Prisma.UserCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n createMany: {\n args: Prisma.UserCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.UserDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n update: {\n args: Prisma.UserUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n deleteMany: {\n args: Prisma.UserDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.UserUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n aggregate: {\n args: Prisma.UserAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUser>\n }\n groupBy: {\n args: Prisma.UserGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserCountAggregateOutputType> | number\n }\n }\n }\n Event: {\n payload: Prisma.$EventPayload<ExtArgs>\n fields: Prisma.EventFieldRefs\n operations: {\n findUnique: {\n args: Prisma.EventFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.EventFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n findFirst: {\n args: Prisma.EventFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.EventFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n findMany: {\n args: Prisma.EventFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>[]\n }\n create: {\n args: Prisma.EventCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n createMany: {\n args: Prisma.EventCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.EventDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n update: {\n args: Prisma.EventUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n deleteMany: {\n args: Prisma.EventDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.EventUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.EventUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n aggregate: {\n args: Prisma.EventAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateEvent>\n }\n groupBy: {\n args: Prisma.EventGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EventGroupByOutputType>[]\n }\n count: {\n args: Prisma.EventCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EventCountAggregateOutputType> | number\n }\n }\n }\n Location: {\n payload: Prisma.$LocationPayload<ExtArgs>\n fields: Prisma.LocationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.LocationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.LocationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n findFirst: {\n args: Prisma.LocationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.LocationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n findMany: {\n args: Prisma.LocationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>[]\n }\n create: {\n args: Prisma.LocationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n createMany: {\n args: Prisma.LocationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.LocationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n update: {\n args: Prisma.LocationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n deleteMany: {\n args: Prisma.LocationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.LocationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.LocationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n aggregate: {\n args: Prisma.LocationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateLocation>\n }\n groupBy: {\n args: Prisma.LocationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LocationGroupByOutputType>[]\n }\n count: {\n args: Prisma.LocationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LocationCountAggregateOutputType> | number\n }\n }\n }\n Mail: {\n payload: Prisma.$MailPayload<ExtArgs>\n fields: Prisma.MailFieldRefs\n operations: {\n findUnique: {\n args: Prisma.MailFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.MailFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n findFirst: {\n args: Prisma.MailFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.MailFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n findMany: {\n args: Prisma.MailFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>[]\n }\n create: {\n args: Prisma.MailCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n createMany: {\n args: Prisma.MailCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.MailDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n update: {\n args: Prisma.MailUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n deleteMany: {\n args: Prisma.MailDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.MailUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.MailUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n aggregate: {\n args: Prisma.MailAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateMail>\n }\n groupBy: {\n args: Prisma.MailGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.MailGroupByOutputType>[]\n }\n count: {\n args: Prisma.MailCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.MailCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n ReadUncommitted: 'ReadUncommitted',\n ReadCommitted: 'ReadCommitted',\n RepeatableRead: 'RepeatableRead',\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const UserScalarFieldEnum = {\n id: 'id',\n prefix: 'prefix',\n createdAt: 'createdAt',\n lastSeenAt: 'lastSeenAt'\n} as const\n\nexport type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]\n\n\nexport const EventScalarFieldEnum = {\n id: 'id',\n orderId: 'orderId',\n from: 'from',\n to: 'to',\n amount: 'amount',\n price: 'price',\n userId: 'userId',\n locationId: 'locationId',\n createdAt: 'createdAt',\n orderedAt: 'orderedAt',\n invoicedAt: 'invoicedAt',\n canceledAt: 'canceledAt'\n} as const\n\nexport type EventScalarFieldEnum = (typeof EventScalarFieldEnum)[keyof typeof EventScalarFieldEnum]\n\n\nexport const LocationScalarFieldEnum = {\n id: 'id',\n name: 'name',\n address: 'address',\n latitude: 'latitude',\n longitude: 'longitude',\n emoji: 'emoji',\n createdAt: 'createdAt'\n} as const\n\nexport type LocationScalarFieldEnum = (typeof LocationScalarFieldEnum)[keyof typeof LocationScalarFieldEnum]\n\n\nexport const MailScalarFieldEnum = {\n id: 'id',\n raw: 'raw',\n error: 'error',\n errorId: 'errorId',\n version: 'version',\n createdAt: 'createdAt',\n erroredAt: 'erroredAt'\n} as const\n\nexport type MailScalarFieldEnum = (typeof MailScalarFieldEnum)[keyof typeof MailScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const UserOrderByRelevanceFieldEnum = {\n id: 'id',\n prefix: 'prefix'\n} as const\n\nexport type UserOrderByRelevanceFieldEnum = (typeof UserOrderByRelevanceFieldEnum)[keyof typeof UserOrderByRelevanceFieldEnum]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\nexport const EventOrderByRelevanceFieldEnum = {\n id: 'id',\n orderId: 'orderId',\n userId: 'userId',\n locationId: 'locationId'\n} as const\n\nexport type EventOrderByRelevanceFieldEnum = (typeof EventOrderByRelevanceFieldEnum)[keyof typeof EventOrderByRelevanceFieldEnum]\n\n\nexport const LocationOrderByRelevanceFieldEnum = {\n id: 'id',\n name: 'name',\n address: 'address',\n emoji: 'emoji'\n} as const\n\nexport type LocationOrderByRelevanceFieldEnum = (typeof LocationOrderByRelevanceFieldEnum)[keyof typeof LocationOrderByRelevanceFieldEnum]\n\n\nexport const MailOrderByRelevanceFieldEnum = {\n id: 'id',\n raw: 'raw',\n error: 'error',\n errorId: 'errorId',\n version: 'version'\n} as const\n\nexport type MailOrderByRelevanceFieldEnum = (typeof MailOrderByRelevanceFieldEnum)[keyof typeof MailOrderByRelevanceFieldEnum]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n user?: Prisma.UserOmit\n event?: Prisma.EventOmit\n location?: Prisma.LocationOmit\n mail?: Prisma.MailOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","import { init } from '@sentry/node';\nimport { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ninit({\n dsn:\n process.env.SENTRY_DSN ||\n 'https://5e4630d58e5f4c778ce22140c53b3684@glitch.sebbo.net/9',\n});\n\nlet dir = dirname(fileURLToPath(import.meta.url));\nif (dir.endsWith('/dist')) {\n dir = resolve(dir, '..', 'src');\n} else {\n dir = resolve(dir, '..');\n}\n\nfunction src(path?: string) {\n return resolve(dir, path || '');\n}\n\nlet version: string | undefined;\ntry {\n const pkg = JSON.parse(readFileSync(src('../package.json'), 'utf8'));\n version = pkg.version;\n} catch (error) {\n console.log('Failed getting tgtg-ical version:');\n console.error(error);\n}\n\nexport default {\n baseMail: process.env.BASE_MAIL || '@tgtg-ical.sebbo.net',\n baseUrl: process.env.BASE_URL || 'https://tgtg-ical.sebbo.net',\n src,\n version,\n};\n","import { captureException } from '@sentry/node';\nimport he from 'he';\nimport { type ParsedMail, simpleParser } from 'mailparser';\nimport moment from 'moment-timezone';\n\nimport type { Location, Mail, User } from './db.js';\n\nimport config from './config.js';\nimport Config from './config.js';\nimport prisma from './db.js';\nimport getEmoji from './emoji.js';\n\ntype AnyMail = (CancellationMail | ChangeMail | InvoiceMail | OrderMail) & {\n to: string;\n};\n\ninterface CancellationMail {\n cancelledAt: moment.Moment;\n orderId: string;\n type: 'cancel';\n}\n\ninterface ChangeMail {\n orderId: string;\n time: {\n from: moment.Moment;\n to: moment.Moment;\n };\n type: 'change';\n}\n\ninterface InvoiceMail {\n invoicedAt: moment.Moment;\n orderId: string;\n type: 'invoice';\n}\n\ninterface OrderMail {\n amount: number;\n location: {\n address: string;\n name: string;\n };\n orderId: string;\n price: number;\n time: {\n from: moment.Moment;\n order: moment.Moment;\n to: moment.Moment;\n };\n type: 'order';\n}\n\nexport default class Parser {\n public static async geocode(\n address: string,\n ): Promise<\n | { latitude: null; longitude: null }\n | { latitude: number; longitude: number }\n > {\n const response = await fetch(\n 'https://nominatim.openstreetmap.org/search?format=json&limit=1&q=' +\n encodeURIComponent(address),\n {\n headers: {\n Referer: config.baseUrl,\n 'User-Agent': `tgtg-ical/${config.version} (${config.baseUrl})`,\n },\n },\n );\n if (!response.ok) {\n throw new Error('Geocoding failed: ' + response.statusText);\n }\n\n // super simple way to ensure a maximum of 1 request per second in cronjobs\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const data = await response.json();\n if (!Array.isArray(data) || data.length === 0) {\n return {\n latitude: null,\n longitude: null,\n };\n }\n\n return {\n latitude: parseFloat(data[0].lat),\n longitude: parseFloat(data[0].lon),\n };\n }\n\n public static async handleMail(mail: Mail) {\n try {\n const parsed = await this.parseMail(mail.raw);\n if (parsed) {\n await this.applyParsedMail(parsed);\n }\n\n await prisma.mail.delete({\n where: {\n id: mail.id,\n },\n });\n } catch (error) {\n const errorId = captureException(error);\n await prisma.mail.update({\n data: {\n error: error instanceof Error ? error.stack : String(error),\n erroredAt: new Date(),\n errorId,\n version: config.version,\n },\n where: {\n id: mail.id,\n },\n });\n }\n }\n\n public static async inhaleMail(email: string): Promise<void> {\n const mail = await prisma.mail.create({\n data: {\n raw: email,\n },\n });\n\n await this.handleMail(mail);\n }\n\n public static async parseMail(\n mail: string,\n baseMailPostfix = config.baseMail,\n ): Promise<AnyMail | undefined> {\n // parse email\n const email = await simpleParser(mail, {\n skipHtmlToText: true,\n skipImageLinks: true,\n skipTextLinks: true,\n skipTextToHtml: true,\n });\n\n if (!email.from?.value[0].address?.endsWith('toogoodtogo.com')) {\n throw new Error('Not a TGTG email!');\n }\n\n let to: string | undefined = (\n Array.isArray(email.to) ? email.to : [email.to]\n )\n .map((to) => to?.value)\n .flat()\n .filter((address) => !!address)\n .map((address) => address.address)\n .find((address) => address?.endsWith(baseMailPostfix));\n\n if (!to) {\n const received = email.headers.get('received');\n const regexp = new RegExp(`([\\\\w-]+${Config.baseMail})`, 'i');\n if (Array.isArray(received)) {\n received.forEach((r) => {\n const s = typeof r === 'string' ? r : r.value;\n const match = s.match(regexp);\n if (match) {\n to = match[1];\n }\n });\n }\n }\n if (!to) {\n throw new Error('No recipient found!');\n }\n\n // Order confirmation\n if (email.headers.get('x-pm-tag') === 'consumer_order_confirm') {\n const order = this.parseOrderMail(email);\n return {\n to,\n ...order,\n };\n }\n\n // Time Changed\n if (email.headers.get('x-pm-tag') === 'collection_time_changed') {\n const change = this.parseChangeMail(email);\n return {\n to,\n ...change,\n };\n }\n\n // Cancellation\n if (email.headers.get('x-pm-tag') === 'consumer_order_reverted') {\n const cancellation = this.parseCancellationMail(email);\n if (cancellation) {\n return {\n to,\n ...cancellation,\n };\n }\n }\n\n // is invoice?\n if (email.headers.get('x-pm-tag') === 'invoice') {\n const invoice = this.parseInvoiceMail(email);\n if (invoice) {\n return {\n to,\n ...invoice,\n };\n }\n }\n\n // Non-transactional email\n if (\n !email.headers.get('x-pm-tag') &&\n !email.headers.get('x-pm-message-id')\n ) {\n return undefined;\n }\n\n // Unsupported email\n if (email.headers.get('x-pm-tag')) {\n throw new Error(\n `Unsupported email type: ${email.headers.get('x-pm-tag')}`,\n );\n }\n\n throw new Error('Not implemented!');\n }\n\n public static async runCleanup(): Promise<void> {\n const mails = await prisma.mail.findMany({\n orderBy: {\n erroredAt: 'asc',\n },\n take: 10,\n where: {\n OR: [\n { error: null },\n { version: null },\n { version: { not: config.version } },\n ],\n },\n });\n for (const mail of mails) {\n await this.handleMail(mail);\n }\n\n // Cleanup Users\n const users = await prisma.user.findMany({\n orderBy: {\n lastSeenAt: 'asc',\n },\n where: {\n OR: [\n {\n lastSeenAt: {\n lt: moment().subtract(8, 'weeks').toDate(),\n },\n },\n {\n createdAt: {\n lt: moment().subtract(3, 'hours').toDate(),\n },\n lastSeenAt: {\n equals: prisma.user.fields.createdAt,\n },\n },\n ],\n },\n });\n for (const user of users) {\n await prisma.user.delete({\n where: {\n id: user.id,\n },\n });\n }\n\n // Cleanup Events\n await prisma.event.deleteMany({\n where: {\n to: {\n lt: moment().subtract(4, 'weeks').toDate(),\n },\n },\n });\n\n // Cleanup Mails\n await prisma.mail.deleteMany({\n where: {\n createdAt: {\n lt: moment().subtract(2, 'weeks').toDate(),\n },\n },\n });\n }\n\n private static async applyParsedMail(email: AnyMail): Promise<void> {\n const user = await this.findUser(email.to);\n\n if (email.type === 'order') {\n const location = await this.getLocation(email.location);\n\n await prisma.event.upsert({\n create: {\n amount: email.amount,\n from: email.time.from.toDate(),\n location: {\n connect: {\n id: location.id,\n },\n },\n orderedAt: email.time.order.toDate(),\n orderId: email.orderId,\n price: email.price,\n to: email.time.to.toDate(),\n user: {\n connect: {\n id: user.id,\n },\n },\n },\n update: {\n amount: email.amount,\n from: email.time.from.toDate(),\n location: {\n connect: {\n id: location.id,\n },\n },\n price: email.price,\n to: email.time.to.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'change') {\n await prisma.event.update({\n data: {\n from: email.time.from.toDate(),\n to: email.time.to.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'cancel') {\n await prisma.event.update({\n data: {\n canceledAt: email.cancelledAt.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'invoice') {\n await prisma.event.update({\n data: {\n invoicedAt: email.invoicedAt.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else {\n throw new Error('Unknown email type!');\n }\n }\n\n private static async findUser(to: string): Promise<User> {\n if (!to) {\n throw new Error('Did not found a valid recipient!');\n }\n\n const prefix = to.split('@')[0];\n const user = await prisma.user.findUnique({\n where: { prefix },\n });\n if (!user) {\n throw new Error(`User with email prefix ${prefix} not found!`);\n }\n\n return user;\n }\n\n private static async getLocation(\n input: OrderMail['location'],\n ): Promise<Location> {\n let location = await prisma.location.findFirst({\n where: {\n address: input.address,\n name: input.name,\n },\n });\n if (!location) {\n const emoji = getEmoji(input.name);\n const { latitude, longitude } = await this.geocode(input.address);\n location = await prisma.location.create({\n data: {\n address: input.address,\n emoji,\n latitude,\n longitude,\n name: input.name,\n },\n });\n }\n\n return location;\n }\n\n private static parseCancellationMail(\n email: ParsedMail,\n ): CancellationMail | undefined {\n const subject = email.subject || '';\n const match = subject.match(/\\((\\w+)\\)/);\n if (match) {\n return {\n cancelledAt: moment(email.date),\n orderId: match[1],\n type: 'cancel',\n };\n }\n }\n\n private static parseChangeMail(email: ParsedMail): ChangeMail {\n const matches = [\n (email.html || '').match(\n /https:\\/\\/share.toogoodtogo.com\\/receipts\\/details\\/(\\w+)/,\n ),\n (email.html || '').match(\n /(\\d{1,2}\\.\\d{2}\\.\\d{2}) zwischen (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2})(?: Uhr)? (\\w+)+ \\(/,\n ),\n ];\n if (!matches[0]) {\n throw new Error('Order ID not found!');\n }\n if (!matches[1]) {\n throw new Error('Date / Time not found!');\n }\n\n let timezone = matches[1][4];\n if (timezone === 'MEZ') {\n timezone = 'MET';\n }\n\n const from = moment.tz(\n matches[1][1] + ' ' + matches[1][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n const to = moment.tz(\n matches[1][1] + ' ' + matches[1][3],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n\n return {\n orderId: matches[0][1].trim(),\n time: {\n from,\n to,\n },\n type: 'change',\n };\n }\n\n private static parseInvoiceMail(email: ParsedMail): InvoiceMail {\n const html = email.html || '';\n const match = html.match(/Die Rechnung für deine Bestellung (\\w+)/);\n if (match) {\n return {\n invoicedAt: moment(email.date),\n orderId: match[1],\n type: 'invoice',\n };\n }\n\n throw new Error('Order Id not found!');\n }\n\n private static parseOrderMail(email: ParsedMail): OrderMail {\n const html = email.html || '';\n const matches = [\n html.match(/\\/order\\/([^/]+)\\//),\n html.match(/Wir bestätigen hiermit deine Bestellung bei ([^(.<]+)/),\n html.match(\n /<span>Du kannst deine Bestellung am (\\d{1,2}\\.\\d{2}\\.\\d{2}) zwischen (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2}) Uhr (\\w+)[^:]+: (.+).<\\/span><\\/div>/,\n ),\n html.match(\n /<span>Du kannst deine Bestellung zwischen (\\d{1,2}\\.\\d{1,2}), (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2})[^:]+: (.+).<\\/span><\\/div>/,\n ),\n html.match(\n /<b>Datum:<\\/b>\\s+<span>(\\d{1,2}\\.\\d{2}\\.\\d{2})<\\/span>/,\n ),\n html.match(\n /Abholzeit:<\\/b>\\s+<span>(\\d{1,2}:\\d{2}) - (\\d{1,2}:\\d{2}) (\\w+)/,\n ),\n html.match(/Anzahl: (\\d+)/),\n html.match(/Anzahl:<\\/b>\\s+<span>(\\d+)/),\n html.match(/Gesamtpreis: ([\\d,.]+)[^\\d,.]/),\n html.match(/Gesamtpreis:<\\/b>\\s+<span>([\\d,.]+)[^\\d,.]/),\n html.match(/Standort:<\\/b>\\s+<span>([^<]+)/),\n ];\n if (!matches[0]) {\n throw new Error('Order ID not found!');\n }\n if (!matches[1]) {\n throw new Error('Location name not found!');\n }\n if (!matches[2] && !matches[3] && !(matches[4] && matches[5])) {\n throw new Error('Date, time and address not found (1)!');\n }\n\n let timezone = 'MET';\n if (matches[2]) {\n timezone = matches[2][4];\n }\n if (matches[5]) {\n timezone = matches[5][3];\n }\n if (timezone === 'MEZ') {\n timezone = 'MET';\n }\n\n const now = moment(email.date);\n let from: moment.Moment | undefined;\n let to: moment.Moment | undefined;\n let address: string | undefined;\n\n if (matches[2]) {\n from = moment.tz(\n matches[2][1] + ' ' + matches[2][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[2][1] + ' ' + matches[2][3],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n address = matches[2][5].trim();\n }\n if (matches[3]) {\n const year = now.year();\n from = moment.tz(\n matches[3][1] + '.' + year + ' ' + matches[3][2],\n 'DD.MM.YYYY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[3][1] + '.' + year + ' ' + matches[3][3],\n 'DD.MM.YYYY HH:mm',\n timezone,\n );\n address = matches[3][4].trim();\n\n if (from.isBefore(now)) {\n from.add(1, 'year');\n }\n if (to.isBefore(from)) {\n to.add(1, 'year');\n }\n }\n if (matches[4] && matches[5] && matches[10]) {\n from = moment.tz(\n matches[4][1] + ' ' + matches[5][1],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[4][1] + ' ' + matches[5][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n address = matches[10][1].trim();\n }\n\n if (!from || !to || !address) {\n throw new Error('Date, time or address not found (2)!');\n }\n\n let amount: number | undefined;\n if (matches[6]) {\n amount = parseInt(matches[6][1], 10);\n } else if (matches[7]) {\n amount = parseInt(matches[7][1], 10);\n } else {\n throw new Error('Amount not found!');\n }\n if (isNaN(amount)) {\n throw new Error('Amount (1) is not a number!');\n }\n\n let price: number | undefined;\n if (matches[8]) {\n price = parseInt(matches[8][1].replace(/[.|,]/g, ''));\n } else if (matches[9]) {\n price = parseInt(matches[9][1].replace(/[.|,]/g, ''));\n } else {\n throw new Error('Price not found!');\n }\n if (isNaN(price)) {\n throw new Error('Price is not a number!');\n }\n\n let name = he.decode(matches[1][1].trim());\n if (name.endsWith('!')) {\n name = name.slice(0, -1);\n }\n\n return {\n amount,\n location: {\n address: he.decode(address),\n name,\n },\n orderId: matches[0][1].trim(),\n price,\n time: {\n from,\n order: now,\n to,\n },\n type: 'order',\n };\n }\n}\n","export const DEFAULT_EMOJI = '🍴';\nexport const EMOJIS: Record<string, RegExp[]> = {\n '🌭': [/Ikea/],\n '🌮': [/Enchilada/, /Besitos/],\n '🍔': [\n /Burger/,\n /McDonald[‘|']?s/,\n /Burger King/,\n /Hans im Glück/,\n /Peter Pane/,\n ],\n '🍕': [\n /Domino‘s/,\n /Pizza Hut/,\n /L[‘|']Osteria/,\n /Call a Pizza/,\n /Smiley[‘|']s Pizza/,\n ],\n '🍗': [/KFC/],\n '🍝': [/LaTagliatella/, /Vapiano/],\n '🍤': [/Nordsee/],\n '🍩': [/Donut/, /Dunkin/],\n '🍪': [/Starbucks/],\n '🥐': [/LeCroBag/],\n '🥖': [\n /Bäckerei/,\n /Back/,\n /BackWerk/,\n /Kamps/,\n /Kamps Backstuben/,\n /Junge Die Bäckerei/,\n /Back-Factory/,\n ],\n '🥗': [/dean ?& ?david/],\n '🥨': [/Brezel/, /Ditsch/],\n '🥩': [/Steakhouse/, /Block House/, /Jim Block/],\n '🥪': [\n /Sandwich/,\n /Tank ?& ?Rast/,\n /T&R Raststätten/,\n /Autohöfe/,\n /Aral/,\n /Shell/,\n /Jet Tank/,\n /Subway/,\n /Caf[é|e] bonjour/,\n /Total Deutschland/,\n /Esso:? Snack ?& ?Shop/,\n ],\n '🛒': [\n /Edeka/,\n /Netto/,\n /Rewe/,\n /Penny/,\n /Lidl/,\n /Kaufland/,\n /Aldi/,\n /dm/,\n /Rossmann/,\n /Globus/,\n /Metro/,\n /Norma/,\n /Tegut/,\n ],\n};\n\nexport default function getEmoji(location: string): null | string {\n for (const emoji in EMOJIS) {\n const regExps = EMOJIS[emoji].map((name) => new RegExp(name, 'i'));\n const match = !!regExps.find((regExp) => regExp.test(location));\n if (match) {\n return emoji;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":["PrismaMariaDb","path","fileURLToPath","runtime","config","decodeBase64AsWasm","wasmBase64","Buffer","wasmArray","wasm","getPrismaClientClass","runtime","getExtensionContext","NullTypes","TransactionIsolationLevel","defineExtension","fileURLToPath","PrismaClient","getPrismaClientClass","databaseUrlStr","databaseUrl","prismaAdapter","PrismaMariaDb","prisma","PrismaClient","db_default","init","readFileSync","dirname","resolve","fileURLToPath","dir","src","path","version","error","config_default","captureException","he","simpleParser","moment","EMOJIS","getEmoji","location","emoji","name","regExp","Parser","address","response","config_default","resolve","data","mail","parsed","db_default","error","errorId","captureException","email","baseMailPostfix","simpleParser","to","received","regexp","r","match","order","change","cancellation","invoice","mails","users","moment","user","location","prefix","input","emoji","getEmoji","latitude","longitude","matches","timezone","from","html","now","year","amount","price","name","he"]}
package/dist/cleanup.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as r,c as e}from"./chunk-TSRRPL4X.js";e.runCleanup().then(()=>r.$disconnect()).catch(n=>{console.error(n),process.exit(1)});
2
+ import{a as r,c as e}from"./chunk-6L6AXKMO.js";e.runCleanup().then(()=>r.$disconnect()).catch(n=>{console.error(n),process.exit(1)});
3
3
  //# sourceMappingURL=cleanup.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin/cleanup.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\n/* istanbul ignore file */\nimport prisma from '../lib/db.js';\nimport Parser from '../lib/parser.js';\n\nParser.runCleanup().then(() => {\n return prisma.$disconnect();\n}).catch((error) => {\n console.error(error);\n process.exit(1);\n});\n"],"mappings":";+CAOAA,EAAO,WAAW,EAAE,KAAK,IACdC,EAAO,YAAY,CAC7B,EAAE,MAAOC,GAAU,CAChB,QAAQ,MAAMA,CAAK,EACnB,QAAQ,KAAK,CAAC,CAClB,CAAC","names":["Parser","db_default","error"]}
1
+ {"version":3,"sources":["../src/bin/cleanup.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\n/* istanbul ignore file */\nimport prisma from '../lib/db.js';\nimport Parser from '../lib/parser.js';\n\nParser.runCleanup()\n .then(() => {\n return prisma.$disconnect();\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n"],"mappings":";+CAOAA,EAAO,WAAW,EACb,KAAK,IACKC,EAAO,YAAY,CAC7B,EACA,MAAOC,GAAU,CACd,QAAQ,MAAMA,CAAK,EACnB,QAAQ,KAAK,CAAC,CAClB,CAAC","names":["Parser","db_default","error"]}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{c as r}from"./chunk-TSRRPL4X.js";var s="";process.stdin.on("data",e=>{s+=e});process.stdin.on("end",()=>{r.inhaleMail(s).catch(e=>{console.error(e),process.exit(1)})});
2
+ import{c as r}from"./chunk-6L6AXKMO.js";var s="";process.stdin.on("data",e=>{s+=e});process.stdin.on("end",()=>{r.inhaleMail(s).catch(e=>{console.error(e),process.exit(1)})});
3
3
  //# sourceMappingURL=inhale-mail.js.map
package/dist/start.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import{a as o,b as i,c as l}from"./chunk-TSRRPL4X.js";import C from"cookie-parser";import p from"express";import{generateName as f,generateNameWithNumber as g}from"@criblinc/docker-names";import{readFile as I}from"fs/promises";import{ICalAlarmType as w,ICalCalendar as E,ICalEventStatus as u}from"ical-generator";import y from"moment-timezone";import{randomUUID as U}from"crypto";var s=class{static async createUser(){let e;for(let t=0;;t++){let r=this.generatePrefix(t);try{if(e=await o.user.create({data:{prefix:r}}),e)break}catch(a){if(a&&typeof a=="object"&&"code"in a&&a.code==="P2002")continue;throw a}}if(!e)throw new Error("User not created");return e}static async generateCalendar(e){let t=await o.user.findUniqueOrThrow({select:{event:{select:{amount:!0,canceledAt:!0,createdAt:!0,from:!0,id:!0,location:{select:{address:!0,emoji:!0,latitude:!0,longitude:!0,name:!0}},orderId:!0,price:!0,to:!0}},id:!0},where:{id:e}}),r=new E({events:t.event.map(a=>{let m=new Intl.NumberFormat("de-DE",{currency:"EUR",style:"currency"}).format(a.price/100),d=u.CONFIRMED;return a.canceledAt&&(d=u.CANCELLED),{alarms:[{trigger:600,type:w.display}],created:a.createdAt,description:`${a.amount}x
2
+ import{a as o,b as i,c as l}from"./chunk-6L6AXKMO.js";import C from"cookie-parser";import p from"express";import{generateName as f,generateNameWithNumber as g}from"@criblinc/docker-names";import{readFile as I}from"fs/promises";import{ICalAlarmType as w,ICalCalendar as E,ICalEventStatus as u}from"ical-generator";import y from"moment-timezone";import{randomUUID as U}from"crypto";var s=class{static async createUser(){let e;for(let t=0;;t++){let r=this.generatePrefix(t);try{if(e=await o.user.create({data:{prefix:r}}),e)break}catch(a){if(a&&typeof a=="object"&&"code"in a&&a.code==="P2002")continue;throw a}}if(!e)throw new Error("User not created");return e}static async generateCalendar(e){let t=await o.user.findUniqueOrThrow({select:{event:{select:{amount:!0,canceledAt:!0,createdAt:!0,from:!0,id:!0,location:{select:{address:!0,emoji:!0,latitude:!0,longitude:!0,name:!0}},orderId:!0,price:!0,to:!0}},id:!0},where:{id:e}}),r=new E({events:t.event.map(a=>{let m=new Intl.NumberFormat("de-DE",{currency:"EUR",style:"currency"}).format(a.price/100),d=u.CONFIRMED;return a.canceledAt&&(d=u.CANCELLED),{alarms:[{trigger:600,type:w.display}],created:a.createdAt,description:`${a.amount}x
3
3
  ${m}`,end:a.to,id:a.id,location:{address:a.location.address,geo:a.location.latitude&&a.location.longitude?{lat:a.location.latitude,lon:a.location.longitude}:void 0,title:a.location.name},start:a.from,status:d,summary:`${a.location.emoji||"\u{1F374}"} ${a.location.name}`,timestamp:a.createdAt,url:`https://share.toogoodtogo.com/receipts/details/${a.orderId}`}}),name:"TGTG",ttl:3600});return this.updateUserLastSeen(e),r.toString()}static generatePrefix(e=0){return e>100?U():e<10?f():g()}static async generateUserPage(e){let[t,r]=await Promise.all([this.getUser(e),I(i.src("templates/user.html"),"utf-8")]);return r.replace(/\${CALENDAR_URL}/g,`${i.baseUrl}/${t.id}/calendar.ical`).replace(/\${EMAIL_ADDRESS}/g,`${t.prefix}${i.baseMail}`)}static async getUser(e){let t=await o.user.findUniqueOrThrow({where:{id:e}});return this.updateUserLastSeen(t.id),t}static async isHealthy(){let e=await o.mail.count({where:{createdAt:{lt:y().subtract(30,"minutes").toDate()}}});if(e>0)throw new Error(`There are ${e} unhandled mails in the queue!`)}static updateUserLastSeen(e){o.user.update({data:{lastSeenAt:new Date},where:{id:e}}).catch(t=>{console.log(t)})}};var n=class c{app;server;constructor(){this.app=p(),this.app.use(C()),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),console.log(`tgtg-ical v${i.version} listening on port ${process.env.PORT||8080}`),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop()),l.runCleanup().then(()=>console.log("Initial cleanup succeeded.")).catch(e=>{console.log("Initial cleanup failed:"),console.error(e),process.exit(1)})}static run(){new c}handleError(e,t){if(e&&typeof e=="object"&&"code"in e&&e.code==="P2025"){t.sendStatus(404);return}console.log(e),t.sendStatus(500)}setupRoutes(){this.app.get("/ping",(e,t)=>{t.send("pong")}),this.app.get("/",(e,t)=>{if("userId"in e.cookies&&e.cookies.userId){t.redirect("/"+e.cookies.userId);return}s.createUser().then(r=>{t.cookie("userId",r.id),t.redirect("/"+r.id)}).catch(r=>this.handleError(r,t))}),this.app.get("/_health",(e,t)=>{s.isHealthy().then(()=>t.sendStatus(204)).catch(r=>this.handleError(r,t))}),this.app.use(p.static(i.src("./assets"))),this.app.get("/:userId",(e,t)=>{t.format({"application/json":()=>{s.getUser(e.params.userId).then(r=>t.send(r)).catch(r=>this.handleError(r,t))},"text/html":()=>{s.generateUserPage(e.params.userId).then(r=>{t.cookie("userId",e.params.userId),t.send(r)}).catch(r=>this.handleError(r,t))}})}),this.app.get("/:userId/calendar.ical",(e,t)=>{s.generateCalendar(e.params.userId).then(r=>{t.set("Content-Type","text/calendar"),t.send(r)}).catch(r=>this.handleError(r,t))})}async stop(){await new Promise(e=>this.server.close(e)),await o.$disconnect(),process.exit()}};n.run();
4
4
  //# sourceMappingURL=start.js.map
package/package.json CHANGED
@@ -21,12 +21,12 @@
21
21
  },
22
22
  "description": "A small server that receives mails from TGTG, parses them and generates an iCal feed from them.",
23
23
  "devDependencies": {
24
- "@eslint/js": "^9.39.2",
24
+ "@eslint/js": "^10.0.1",
25
25
  "@sebbo2002/semantic-release-docker": "^6.0.2",
26
26
  "@semantic-release/changelog": "^6.0.3",
27
27
  "@semantic-release/exec": "^7.1.0",
28
28
  "@semantic-release/git": "^10.0.1",
29
- "@semantic-release/npm": "^13.1.3",
29
+ "@semantic-release/npm": "^13.1.4",
30
30
  "@types/cookie-parser": "^1.4.10",
31
31
  "@types/express": "^5.0.6",
32
32
  "@types/he": "^1.2.3",
@@ -34,11 +34,12 @@
34
34
  "@types/mocha": "^10.0.10",
35
35
  "@types/node": "^25.2.3",
36
36
  "c8": "^10.1.3",
37
- "eslint": "^9.39.2",
37
+ "eslint": "^10.0.0",
38
38
  "eslint-config-prettier": "^10.1.8",
39
- "eslint-plugin-jsonc": "^2.21.0",
40
- "eslint-plugin-perfectionist": "^5.4.0",
39
+ "eslint-plugin-jsonc": "^2.21.1",
40
+ "eslint-plugin-perfectionist": "^5.5.0",
41
41
  "esm": "^3.2.25",
42
+ "globals": "^17.3.0",
42
43
  "husky": "^9.1.7",
43
44
  "license-checker": "^25.0.1",
44
45
  "mocha": "^11.7.5",
@@ -50,9 +51,9 @@
50
51
  "source-map-support": "^0.5.21",
51
52
  "tsup": "^8.5.1",
52
53
  "tsx": "^4.21.0",
53
- "typedoc": "^0.28.16",
54
+ "typedoc": "^0.28.17",
54
55
  "typescript": "^5.9.3",
55
- "typescript-eslint": "^8.54.0"
56
+ "typescript-eslint": "^8.56.0"
56
57
  },
57
58
  "engines": {
58
59
  "node": "20 || >=22.0.0"
@@ -89,5 +90,5 @@
89
90
  "test": "mocha"
90
91
  },
91
92
  "type": "module",
92
- "version": "3.1.4-develop.1"
93
+ "version": "3.1.4-develop.2"
93
94
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/db.ts","../src/prisma/prisma/client.ts","../src/prisma/prisma/internal/class.ts","../src/prisma/prisma/internal/prismaNamespace.ts","../src/lib/config.ts","../src/lib/parser.ts","../src/lib/emoji.ts"],"sourcesContent":["import { PrismaMariaDb } from '@prisma/adapter-mariadb';\n\nimport { PrismaClient } from '../prisma/prisma/client.js';\n\nconst databaseUrlStr = process.env.DATABASE_URL;\nif (!databaseUrlStr) {\n throw new Error('DATABASE_URL is not set');\n}\n\nconst databaseUrl = new URL(databaseUrlStr);\nconst prismaAdapter = new PrismaMariaDb({\n connectionLimit: 5,\n database: databaseUrl.pathname.slice(1),\n host: databaseUrl.hostname,\n password: databaseUrl.password,\n port: parseInt(databaseUrl.port, 10) || 3306,\n user: databaseUrl.username,\n});\nconst prisma = new PrismaClient({\n adapter: prismaAdapter,\n});\n\nexport default prisma;\nexport * from '../prisma/prisma/client.js'\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums.js\"\nimport * as $Class from \"./internal/class.js\"\nimport * as Prisma from \"./internal/prismaNamespace.js\"\n\nexport * as $Enums from './enums.js'\nexport * from \"./enums.js\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model User\n * \n */\nexport type User = Prisma.UserModel\n/**\n * Model Event\n * \n */\nexport type Event = Prisma.EventModel\n/**\n * Model Location\n * \n */\nexport type Location = Prisma.LocationModel\n/**\n * Model Mail\n * \n */\nexport type Mail = Prisma.MailModel\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace.js\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.4.0\",\n \"engineVersion\": \"ab56fe763f921d033a6c195e7ddeb3e255bdbb57\",\n \"activeProvider\": \"mysql\",\n \"inlineSchema\": \"// This is your Prisma schema file,\\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"./prisma\\\"\\n importFileExtension = \\\"js\\\"\\n}\\n\\ndatasource db {\\n provider = \\\"mysql\\\"\\n}\\n\\nmodel User {\\n id String @id @default(uuid())\\n prefix String @unique\\n createdAt DateTime @default(now())\\n lastSeenAt DateTime @default(now())\\n event Event[]\\n}\\n\\nmodel Event {\\n id String @id @default(uuid())\\n orderId String @unique\\n from DateTime\\n to DateTime\\n amount Int\\n price Int\\n user User @relation(fields: [userId], references: [id])\\n userId String\\n location Location @relation(fields: [locationId], references: [id])\\n locationId String\\n createdAt DateTime @default(now())\\n orderedAt DateTime\\n invoicedAt DateTime?\\n canceledAt DateTime?\\n}\\n\\nmodel Location {\\n id String @id @default(uuid())\\n name String\\n address String\\n latitude Float?\\n longitude Float?\\n emoji String? @db.VarChar(16)\\n createdAt DateTime @default(now())\\n event Event[]\\n}\\n\\nmodel Mail {\\n id String @id @default(uuid())\\n raw String @db.MediumText\\n error String? @db.MediumText\\n errorId String?\\n version String?\\n createdAt DateTime @default(now())\\n erroredAt DateTime?\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n },\n \"parameterizationSchema\": {\n \"strings\": [],\n \"graph\": \"\"\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"User\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"prefix\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"lastSeenAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"event\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Event\\\",\\\"relationName\\\":\\\"EventToUser\\\"}],\\\"dbName\\\":null},\\\"Event\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"orderId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"from\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"to\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"amount\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"price\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"EventToUser\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"location\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Location\\\",\\\"relationName\\\":\\\"EventToLocation\\\"},{\\\"name\\\":\\\"locationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"orderedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"invoicedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"canceledAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null},\\\"Location\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"address\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"latitude\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Float\\\"},{\\\"name\\\":\\\"longitude\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Float\\\"},{\\\"name\\\":\\\"emoji\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"event\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Event\\\",\\\"relationName\\\":\\\"EventToLocation\\\"}],\\\"dbName\\\":null},\\\"Mail\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"raw\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"error\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"errorId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"version\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"erroredAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n strings: JSON.parse(\"[\\\"where\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"user\\\",\\\"event\\\",\\\"_count\\\",\\\"location\\\",\\\"User.findUnique\\\",\\\"User.findUniqueOrThrow\\\",\\\"User.findFirst\\\",\\\"User.findFirstOrThrow\\\",\\\"User.findMany\\\",\\\"data\\\",\\\"User.createOne\\\",\\\"User.createMany\\\",\\\"User.updateOne\\\",\\\"User.updateMany\\\",\\\"create\\\",\\\"update\\\",\\\"User.upsertOne\\\",\\\"User.deleteOne\\\",\\\"User.deleteMany\\\",\\\"having\\\",\\\"_min\\\",\\\"_max\\\",\\\"User.groupBy\\\",\\\"User.aggregate\\\",\\\"Event.findUnique\\\",\\\"Event.findUniqueOrThrow\\\",\\\"Event.findFirst\\\",\\\"Event.findFirstOrThrow\\\",\\\"Event.findMany\\\",\\\"Event.createOne\\\",\\\"Event.createMany\\\",\\\"Event.updateOne\\\",\\\"Event.updateMany\\\",\\\"Event.upsertOne\\\",\\\"Event.deleteOne\\\",\\\"Event.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"Event.groupBy\\\",\\\"Event.aggregate\\\",\\\"Location.findUnique\\\",\\\"Location.findUniqueOrThrow\\\",\\\"Location.findFirst\\\",\\\"Location.findFirstOrThrow\\\",\\\"Location.findMany\\\",\\\"Location.createOne\\\",\\\"Location.createMany\\\",\\\"Location.updateOne\\\",\\\"Location.updateMany\\\",\\\"Location.upsertOne\\\",\\\"Location.deleteOne\\\",\\\"Location.deleteMany\\\",\\\"Location.groupBy\\\",\\\"Location.aggregate\\\",\\\"Mail.findUnique\\\",\\\"Mail.findUniqueOrThrow\\\",\\\"Mail.findFirst\\\",\\\"Mail.findFirstOrThrow\\\",\\\"Mail.findMany\\\",\\\"Mail.createOne\\\",\\\"Mail.createMany\\\",\\\"Mail.updateOne\\\",\\\"Mail.updateMany\\\",\\\"Mail.upsertOne\\\",\\\"Mail.deleteOne\\\",\\\"Mail.deleteMany\\\",\\\"Mail.groupBy\\\",\\\"Mail.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"raw\\\",\\\"error\\\",\\\"errorId\\\",\\\"version\\\",\\\"createdAt\\\",\\\"erroredAt\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"search\\\",\\\"name\\\",\\\"address\\\",\\\"latitude\\\",\\\"longitude\\\",\\\"emoji\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"orderId\\\",\\\"from\\\",\\\"to\\\",\\\"amount\\\",\\\"price\\\",\\\"userId\\\",\\\"locationId\\\",\\\"orderedAt\\\",\\\"invoicedAt\\\",\\\"canceledAt\\\",\\\"prefix\\\",\\\"lastSeenAt\\\",\\\"is\\\",\\\"isNot\\\",\\\"_relevance\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"createMany\\\",\\\"set\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\"]\"),\n graph: \"zAEfOAgEAAB7ACBHAACBAQAwSAAACwAQSQAAgQEAMEoBAAAAAU9AAHMAIW8BAAAAAXBAAHMAIQEAAAABACARAwAAhAEAIAYAAIUBACBHAACCAQAwSAAAAwAQSQAAggEAMEoBAHEAIU9AAHMAIWUBAHEAIWZAAHMAIWdAAHMAIWgCAIMBACFpAgCDAQAhagEAcQAhawEAcQAhbEAAcwAhbUAAdAAhbkAAdAAhBQMAAL4BACAGAAC_AQAgbQAAhgEAIG4AAIYBACBzAADAAQAgEQMAAIQBACAGAACFAQAgRwAAggEAMEgAAAMAEEkAAIIBADBKAQAAAAFPQABzACFlAQAAAAFmQABzACFnQABzACFoAgCDAQAhaQIAgwEAIWoBAHEAIWsBAHEAIWxAAHMAIW1AAHQAIW5AAHQAIQMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAMAIAEAAAADACABAAAAAQAgCAQAAHsAIEcAAIEBADBIAAALABBJAACBAQAwSgEAcQAhT0AAcwAhbwEAcQAhcEAAcwAhAgQAAKYBACBzAAC9AQAgAwAAAAsAIAEAAAwAMAIAAAEAIAMAAAALACABAAAMADACAAABACADAAAACwAgAQAADAAwAgAAAQAgBQQAALwBACBKAQAAAAFPQAAAAAFvAQAAAAFwQAAAAAEBDAAAEAAgBEoBAAAAAU9AAAAAAW8BAAAAAXBAAAAAAQEMAAASADAFBAAAsgEAIEoBAIoBACFPQACMAQAhbwEAigEAIXBAAIwBACECAAAAAQAgDAAAFAAgBEoBAIoBACFPQACMAQAhbwEAigEAIXBAAIwBACECAAAACwAgDAAAFgAgAwAAAAEAIBEAABAAIBIAABQAIAEAAAABACABAAAACwAgAwUAAK8BACAXAACxAQAgGAAAsAEAIAdHAACAAQAwSAAAHAAQSQAAgAEAMEoBAGIAIU9AAGQAIW8BAGIAIXBAAGQAIQMAAAALACABAAAbADAWAAAcACADAAAACwAgAQAADAAwAgAAAQAgAQAAAAUAIAEAAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACAOAwAApAEAIAYAAK4BACBKAQAAAAFPQAAAAAFlAQAAAAFmQAAAAAFnQAAAAAFoAgAAAAFpAgAAAAFqAQAAAAFrAQAAAAFsQAAAAAFtQAAAAAFuQAAAAAEBDAAAJAAgDEoBAAAAAU9AAAAAAWUBAAAAAWZAAAAAAWdAAAAAAWgCAAAAAWkCAAAAAWoBAAAAAWsBAAAAAWxAAAAAAW1AAAAAAW5AAAAAAQEMAAAmADAOAwAAogEAIAYAAK0BACBKAQCKAQAhT0AAjAEAIWUBAIoBACFmQACMAQAhZ0AAjAEAIWgCAKABACFpAgCgAQAhagEAigEAIWsBAIoBACFsQACMAQAhbUAAjQEAIW5AAI0BACECAAAABQAgDAAAKAAgDEoBAIoBACFPQACMAQAhZQEAigEAIWZAAIwBACFnQACMAQAhaAIAoAEAIWkCAKABACFqAQCKAQAhawEAigEAIWxAAIwBACFtQACNAQAhbkAAjQEAIQIAAAADACAMAAAqACADAAAABQAgEQAAJAAgEgAAKAAgAQAAAAUAIAEAAAADACAHBQAAqAEAIBcAAKsBACAYAACqAQAgJwAAqQEAICgAAKwBACBtAACGAQAgbgAAhgEAIA9HAAB8ADBIAAAwABBJAAB8ADBKAQBiACFPQABkACFlAQBiACFmQABkACFnQABkACFoAgB9ACFpAgB9ACFqAQBiACFrAQBiACFsQABkACFtQABlACFuQABlACEDAAAAAwAgAQAALwAwFgAAMAAgAwAAAAMAIAEAAAQAMAIAAAUAIAsEAAB7ACBHAAB5ADBIAAA2ABBJAAB5ADBKAQAAAAFPQABzACFdAQBxACFeAQBxACFfCAB6ACFgCAB6ACFhAQByACEBAAAAMwAgAQAAADMAIAsEAAB7ACBHAAB5ADBIAAA2ABBJAAB5ADBKAQBxACFPQABzACFdAQBxACFeAQBxACFfCAB6ACFgCAB6ACFhAQByACEFBAAApgEAIF8AAIYBACBgAACGAQAgYQAAhgEAIHMAAKcBACADAAAANgAgAQAANwAwAgAAMwAgAwAAADYAIAEAADcAMAIAADMAIAMAAAA2ACABAAA3ADACAAAzACAIBAAApQEAIEoBAAAAAU9AAAAAAV0BAAAAAV4BAAAAAV8IAAAAAWAIAAAAAWEBAAAAAQEMAAA7ACAHSgEAAAABT0AAAAABXQEAAAABXgEAAAABXwgAAAABYAgAAAABYQEAAAABAQwAAD0AMAgEAACVAQAgSgEAigEAIU9AAIwBACFdAQCKAQAhXgEAigEAIV8IAJQBACFgCACUAQAhYQEAiwEAIQIAAAAzACAMAAA_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_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\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.mysql.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.mysql.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient()\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.user`: Exposes CRUD operations for the **User** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Users\n * const users = await prisma.user.findMany()\n * ```\n */\n get user(): Prisma.UserDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.event`: Exposes CRUD operations for the **Event** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Events\n * const events = await prisma.event.findMany()\n * ```\n */\n get event(): Prisma.EventDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.location`: Exposes CRUD operations for the **Location** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Locations\n * const locations = await prisma.location.findMany()\n * ```\n */\n get location(): Prisma.LocationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.mail`: Exposes CRUD operations for the **Mail** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Mail\n * const mail = await prisma.mail.findMany()\n * ```\n */\n get mail(): Prisma.MailDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models.js\"\nimport { type PrismaClient } from \"./class.js\"\n\nexport type * from '../models.js'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.4.0\n * Query Engine version: ab56fe763f921d033a6c195e7ddeb3e255bdbb57\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.4.0\",\n engine: \"ab56fe763f921d033a6c195e7ddeb3e255bdbb57\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n User: 'User',\n Event: 'Event',\n Location: 'Location',\n Mail: 'Mail'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"user\" | \"event\" | \"location\" | \"mail\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n User: {\n payload: Prisma.$UserPayload<ExtArgs>\n fields: Prisma.UserFieldRefs\n operations: {\n findUnique: {\n args: Prisma.UserFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.UserFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n findFirst: {\n args: Prisma.UserFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.UserFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n findMany: {\n args: Prisma.UserFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]\n }\n create: {\n args: Prisma.UserCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n createMany: {\n args: Prisma.UserCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.UserDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n update: {\n args: Prisma.UserUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n deleteMany: {\n args: Prisma.UserDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.UserUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.UserUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n }\n aggregate: {\n args: Prisma.UserAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateUser>\n }\n groupBy: {\n args: Prisma.UserGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserGroupByOutputType>[]\n }\n count: {\n args: Prisma.UserCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.UserCountAggregateOutputType> | number\n }\n }\n }\n Event: {\n payload: Prisma.$EventPayload<ExtArgs>\n fields: Prisma.EventFieldRefs\n operations: {\n findUnique: {\n args: Prisma.EventFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.EventFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n findFirst: {\n args: Prisma.EventFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.EventFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n findMany: {\n args: Prisma.EventFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>[]\n }\n create: {\n args: Prisma.EventCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n createMany: {\n args: Prisma.EventCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.EventDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n update: {\n args: Prisma.EventUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n deleteMany: {\n args: Prisma.EventDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.EventUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.EventUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EventPayload>\n }\n aggregate: {\n args: Prisma.EventAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateEvent>\n }\n groupBy: {\n args: Prisma.EventGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EventGroupByOutputType>[]\n }\n count: {\n args: Prisma.EventCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EventCountAggregateOutputType> | number\n }\n }\n }\n Location: {\n payload: Prisma.$LocationPayload<ExtArgs>\n fields: Prisma.LocationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.LocationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.LocationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n findFirst: {\n args: Prisma.LocationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.LocationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n findMany: {\n args: Prisma.LocationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>[]\n }\n create: {\n args: Prisma.LocationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n createMany: {\n args: Prisma.LocationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.LocationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n update: {\n args: Prisma.LocationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n deleteMany: {\n args: Prisma.LocationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.LocationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.LocationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$LocationPayload>\n }\n aggregate: {\n args: Prisma.LocationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateLocation>\n }\n groupBy: {\n args: Prisma.LocationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LocationGroupByOutputType>[]\n }\n count: {\n args: Prisma.LocationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.LocationCountAggregateOutputType> | number\n }\n }\n }\n Mail: {\n payload: Prisma.$MailPayload<ExtArgs>\n fields: Prisma.MailFieldRefs\n operations: {\n findUnique: {\n args: Prisma.MailFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.MailFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n findFirst: {\n args: Prisma.MailFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.MailFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n findMany: {\n args: Prisma.MailFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>[]\n }\n create: {\n args: Prisma.MailCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n createMany: {\n args: Prisma.MailCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n delete: {\n args: Prisma.MailDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n update: {\n args: Prisma.MailUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n deleteMany: {\n args: Prisma.MailDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.MailUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n upsert: {\n args: Prisma.MailUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$MailPayload>\n }\n aggregate: {\n args: Prisma.MailAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateMail>\n }\n groupBy: {\n args: Prisma.MailGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.MailGroupByOutputType>[]\n }\n count: {\n args: Prisma.MailCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.MailCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n ReadUncommitted: 'ReadUncommitted',\n ReadCommitted: 'ReadCommitted',\n RepeatableRead: 'RepeatableRead',\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const UserScalarFieldEnum = {\n id: 'id',\n prefix: 'prefix',\n createdAt: 'createdAt',\n lastSeenAt: 'lastSeenAt'\n} as const\n\nexport type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]\n\n\nexport const EventScalarFieldEnum = {\n id: 'id',\n orderId: 'orderId',\n from: 'from',\n to: 'to',\n amount: 'amount',\n price: 'price',\n userId: 'userId',\n locationId: 'locationId',\n createdAt: 'createdAt',\n orderedAt: 'orderedAt',\n invoicedAt: 'invoicedAt',\n canceledAt: 'canceledAt'\n} as const\n\nexport type EventScalarFieldEnum = (typeof EventScalarFieldEnum)[keyof typeof EventScalarFieldEnum]\n\n\nexport const LocationScalarFieldEnum = {\n id: 'id',\n name: 'name',\n address: 'address',\n latitude: 'latitude',\n longitude: 'longitude',\n emoji: 'emoji',\n createdAt: 'createdAt'\n} as const\n\nexport type LocationScalarFieldEnum = (typeof LocationScalarFieldEnum)[keyof typeof LocationScalarFieldEnum]\n\n\nexport const MailScalarFieldEnum = {\n id: 'id',\n raw: 'raw',\n error: 'error',\n errorId: 'errorId',\n version: 'version',\n createdAt: 'createdAt',\n erroredAt: 'erroredAt'\n} as const\n\nexport type MailScalarFieldEnum = (typeof MailScalarFieldEnum)[keyof typeof MailScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const UserOrderByRelevanceFieldEnum = {\n id: 'id',\n prefix: 'prefix'\n} as const\n\nexport type UserOrderByRelevanceFieldEnum = (typeof UserOrderByRelevanceFieldEnum)[keyof typeof UserOrderByRelevanceFieldEnum]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\nexport const EventOrderByRelevanceFieldEnum = {\n id: 'id',\n orderId: 'orderId',\n userId: 'userId',\n locationId: 'locationId'\n} as const\n\nexport type EventOrderByRelevanceFieldEnum = (typeof EventOrderByRelevanceFieldEnum)[keyof typeof EventOrderByRelevanceFieldEnum]\n\n\nexport const LocationOrderByRelevanceFieldEnum = {\n id: 'id',\n name: 'name',\n address: 'address',\n emoji: 'emoji'\n} as const\n\nexport type LocationOrderByRelevanceFieldEnum = (typeof LocationOrderByRelevanceFieldEnum)[keyof typeof LocationOrderByRelevanceFieldEnum]\n\n\nexport const MailOrderByRelevanceFieldEnum = {\n id: 'id',\n raw: 'raw',\n error: 'error',\n errorId: 'errorId',\n version: 'version'\n} as const\n\nexport type MailOrderByRelevanceFieldEnum = (typeof MailOrderByRelevanceFieldEnum)[keyof typeof MailOrderByRelevanceFieldEnum]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n}\nexport type GlobalOmitConfig = {\n user?: Prisma.UserOmit\n event?: Prisma.EventOmit\n location?: Prisma.LocationOmit\n mail?: Prisma.MailOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","import { init } from '@sentry/node';\nimport { readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\ninit({\n dsn:\n process.env.SENTRY_DSN ||\n 'https://5e4630d58e5f4c778ce22140c53b3684@glitch.sebbo.net/9',\n});\n\nlet dir = dirname(fileURLToPath(import.meta.url));\nif (dir.endsWith('/dist')) {\n dir = resolve(dir, '..', 'src');\n} else {\n dir = resolve(dir, '..');\n}\n\nfunction src(path?: string) {\n return resolve(dir, path || '');\n}\n\nlet version: string | undefined;\ntry {\n const pkg = JSON.parse(readFileSync(src('../package.json'), 'utf8'));\n version = pkg.version;\n} catch (error) {\n console.log('Failed getting tgtg-ical version:');\n console.error(error);\n}\n\nexport default {\n baseMail: process.env.BASE_MAIL || '@tgtg-ical.sebbo.net',\n baseUrl: process.env.BASE_URL || 'https://tgtg-ical.sebbo.net',\n src,\n version,\n};\n","import { captureException } from '@sentry/node';\nimport he from 'he';\nimport { type ParsedMail, simpleParser } from 'mailparser';\nimport moment from 'moment-timezone';\n\nimport type { Location, Mail, User } from './db.js';\n\nimport config from './config.js';\nimport Config from './config.js';\nimport prisma from './db.js';\nimport getEmoji from './emoji.js';\n\ntype AnyMail = (CancellationMail | ChangeMail | InvoiceMail | OrderMail) & {\n to: string;\n};\n\ninterface CancellationMail {\n cancelledAt: moment.Moment;\n orderId: string;\n type: 'cancel';\n}\n\ninterface ChangeMail {\n orderId: string;\n time: {\n from: moment.Moment;\n to: moment.Moment;\n };\n type: 'change';\n}\n\ninterface InvoiceMail {\n invoicedAt: moment.Moment;\n orderId: string;\n type: 'invoice';\n}\n\ninterface OrderMail {\n amount: number;\n location: {\n address: string;\n name: string;\n };\n orderId: string;\n price: number;\n time: {\n from: moment.Moment;\n order: moment.Moment;\n to: moment.Moment;\n };\n type: 'order';\n}\n\nexport default class Parser {\n public static async geocode(\n address: string,\n ): Promise<\n | { latitude: null; longitude: null }\n | { latitude: number; longitude: number }\n > {\n const response = await fetch(\n 'https://nominatim.openstreetmap.org/search?format=json&limit=1&q=' +\n encodeURIComponent(address),\n {\n headers: {\n Referer: config.baseUrl,\n 'User-Agent': `tgtg-ical/${config.version} (${config.baseUrl})`,\n },\n },\n );\n if (!response.ok) {\n throw new Error('Geocoding failed: ' + response.statusText);\n }\n\n // super simple way to ensure a maximum of 1 request per second in cronjobs\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n const data = await response.json();\n if (!Array.isArray(data) || data.length === 0) {\n return {\n latitude: null,\n longitude: null,\n };\n }\n\n return {\n latitude: parseFloat(data[0].lat),\n longitude: parseFloat(data[0].lon),\n };\n }\n\n public static async handleMail(mail: Mail) {\n try {\n const parsed = await this.parseMail(mail.raw);\n if (parsed) {\n await this.applyParsedMail(parsed);\n }\n\n await prisma.mail.delete({\n where: {\n id: mail.id,\n },\n });\n } catch (error) {\n const errorId = captureException(error);\n await prisma.mail.update({\n data: {\n error: error instanceof Error ? error.stack : String(error),\n erroredAt: new Date(),\n errorId,\n version: config.version,\n },\n where: {\n id: mail.id,\n },\n });\n }\n }\n\n public static async inhaleMail(email: string): Promise<void> {\n const mail = await prisma.mail.create({\n data: {\n raw: email,\n },\n });\n\n await this.handleMail(mail);\n }\n\n public static async parseMail(\n mail: string,\n baseMailPostfix = config.baseMail,\n ): Promise<AnyMail | undefined> {\n // parse email\n const email = await simpleParser(mail, {\n skipHtmlToText: true,\n skipImageLinks: true,\n skipTextLinks: true,\n skipTextToHtml: true,\n });\n\n if (!email.from?.value[0].address?.endsWith('toogoodtogo.com')) {\n throw new Error('Not a TGTG email!');\n }\n\n let to: string | undefined = (\n Array.isArray(email.to) ? email.to : [email.to]\n )\n .map((to) => to?.value)\n .flat()\n .filter((address) => !!address)\n .map((address) => address.address)\n .find((address) => address?.endsWith(baseMailPostfix));\n\n if (!to) {\n const received = email.headers.get('received');\n const regexp = new RegExp(`([\\\\w-]+${Config.baseMail})`, 'i');\n if (Array.isArray(received)) {\n received.forEach((r) => {\n const s = typeof r === 'string' ? r : r.value;\n const match = s.match(regexp);\n if (match) {\n to = match[1];\n }\n });\n }\n }\n if (!to) {\n throw new Error('No recipient found!');\n }\n\n // Order confirmation\n if (email.headers.get('x-pm-tag') === 'consumer_order_confirm') {\n const order = this.parseOrderMail(email);\n return {\n to,\n ...order,\n };\n }\n\n // Time Changed\n if (email.headers.get('x-pm-tag') === 'collection_time_changed') {\n const change = this.parseChangeMail(email);\n return {\n to,\n ...change,\n };\n }\n\n // Cancellation\n if (email.headers.get('x-pm-tag') === 'consumer_order_reverted') {\n const cancellation = this.parseCancellationMail(email);\n if (cancellation) {\n return {\n to,\n ...cancellation,\n };\n }\n }\n\n // is invoice?\n if (email.headers.get('x-pm-tag') === 'invoice') {\n const invoice = this.parseInvoiceMail(email);\n if (invoice) {\n return {\n to,\n ...invoice,\n };\n }\n }\n\n // Non-transactional email\n if (\n !email.headers.get('x-pm-tag') &&\n !email.headers.get('x-pm-message-id')\n ) {\n return undefined;\n }\n\n // Unsupported email\n if (email.headers.get('x-pm-tag')) {\n throw new Error(\n `Unsupported email type: ${email.headers.get('x-pm-tag')}`,\n );\n }\n\n throw new Error('Not implemented!');\n }\n\n public static async runCleanup(): Promise<void> {\n const mails = await prisma.mail.findMany({\n orderBy: {\n erroredAt: 'asc',\n },\n take: 10,\n where: {\n OR: [\n { error: null },\n { version: null },\n { version: { not: config.version } },\n ],\n },\n });\n for (const mail of mails) {\n await this.handleMail(mail);\n }\n\n // Cleanup Users\n const users = await prisma.user.findMany({\n orderBy: {\n lastSeenAt: 'asc',\n },\n where: {\n OR: [\n {\n lastSeenAt: {\n lt: moment().subtract(8, 'weeks').toDate(),\n },\n },\n {\n createdAt: {\n lt: moment().subtract(3, 'hours').toDate(),\n },\n lastSeenAt: {\n equals: prisma.user.fields.createdAt,\n },\n },\n ],\n }\n });\n for (const user of users) {\n await prisma.user.delete({\n where: {\n id: user.id,\n },\n });\n }\n\n // Cleanup Events\n await prisma.event.deleteMany({\n where: {\n to: {\n lt: moment().subtract(4, 'weeks').toDate(),\n },\n },\n });\n\n // Cleanup Mails\n await prisma.mail.deleteMany({\n where: {\n createdAt: {\n lt: moment().subtract(2, 'weeks').toDate(),\n },\n },\n });\n }\n\n private static async applyParsedMail(email: AnyMail): Promise<void> {\n const user = await this.findUser(email.to);\n\n if (email.type === 'order') {\n const location = await this.getLocation(email.location);\n\n await prisma.event.upsert({\n create: {\n amount: email.amount,\n from: email.time.from.toDate(),\n location: {\n connect: {\n id: location.id,\n },\n },\n orderedAt: email.time.order.toDate(),\n orderId: email.orderId,\n price: email.price,\n to: email.time.to.toDate(),\n user: {\n connect: {\n id: user.id,\n },\n },\n },\n update: {\n amount: email.amount,\n from: email.time.from.toDate(),\n location: {\n connect: {\n id: location.id,\n },\n },\n price: email.price,\n to: email.time.to.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'change') {\n await prisma.event.update({\n data: {\n from: email.time.from.toDate(),\n to: email.time.to.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'cancel') {\n await prisma.event.update({\n data: {\n canceledAt: email.cancelledAt.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else if (email.type === 'invoice') {\n await prisma.event.update({\n data: {\n invoicedAt: email.invoicedAt.toDate(),\n },\n where: {\n orderId: email.orderId,\n userId: user.id,\n },\n });\n } else {\n throw new Error('Unknown email type!');\n }\n }\n\n private static async findUser(to: string): Promise<User> {\n if (!to) {\n throw new Error('Did not found a valid recipient!');\n }\n\n const prefix = to.split('@')[0];\n const user = await prisma.user.findUnique({\n where: { prefix },\n });\n if (!user) {\n throw new Error(`User with email prefix ${prefix} not found!`);\n }\n\n return user;\n }\n\n private static async getLocation(\n input: OrderMail['location'],\n ): Promise<Location> {\n let location = await prisma.location.findFirst({\n where: {\n address: input.address,\n name: input.name,\n },\n });\n if (!location) {\n const emoji = getEmoji(input.name);\n const { latitude, longitude } = await this.geocode(input.address);\n location = await prisma.location.create({\n data: {\n address: input.address,\n emoji,\n latitude,\n longitude,\n name: input.name,\n },\n });\n }\n\n return location;\n }\n\n private static parseCancellationMail(\n email: ParsedMail,\n ): CancellationMail | undefined {\n const subject = email.subject || '';\n const match = subject.match(/\\((\\w+)\\)/);\n if (match) {\n return {\n cancelledAt: moment(email.date),\n orderId: match[1],\n type: 'cancel',\n };\n }\n }\n\n private static parseChangeMail(email: ParsedMail): ChangeMail {\n const matches = [\n (email.html || '').match(\n /https:\\/\\/share.toogoodtogo.com\\/receipts\\/details\\/(\\w+)/,\n ),\n (email.html || '').match(\n /(\\d{1,2}\\.\\d{2}\\.\\d{2}) zwischen (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2})(?: Uhr)? (\\w+)+ \\(/,\n ),\n ];\n if (!matches[0]) {\n throw new Error('Order ID not found!');\n }\n if (!matches[1]) {\n throw new Error('Date / Time not found!');\n }\n\n let timezone = matches[1][4];\n if (timezone === 'MEZ') {\n timezone = 'MET';\n }\n\n const from = moment.tz(\n matches[1][1] + ' ' + matches[1][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n const to = moment.tz(\n matches[1][1] + ' ' + matches[1][3],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n\n return {\n orderId: matches[0][1].trim(),\n time: {\n from,\n to,\n },\n type: 'change',\n };\n }\n\n private static parseInvoiceMail(email: ParsedMail): InvoiceMail {\n const html = email.html || '';\n const match = html.match(/Die Rechnung für deine Bestellung (\\w+)/);\n if (match) {\n return {\n invoicedAt: moment(email.date),\n orderId: match[1],\n type: 'invoice',\n };\n }\n\n throw new Error('Order Id not found!');\n }\n\n private static parseOrderMail(email: ParsedMail): OrderMail {\n const html = email.html || '';\n const matches = [\n html.match(/\\/order\\/([^/]+)\\//),\n html.match(/Wir bestätigen hiermit deine Bestellung bei ([^(.<]+)/),\n html.match(\n /<span>Du kannst deine Bestellung am (\\d{1,2}\\.\\d{2}\\.\\d{2}) zwischen (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2}) Uhr (\\w+)[^:]+: (.+).<\\/span><\\/div>/,\n ),\n html.match(\n /<span>Du kannst deine Bestellung zwischen (\\d{1,2}\\.\\d{1,2}), (\\d{1,2}:\\d{2}) und (\\d{1,2}:\\d{2})[^:]+: (.+).<\\/span><\\/div>/,\n ),\n html.match(\n /<b>Datum:<\\/b>\\s+<span>(\\d{1,2}\\.\\d{2}\\.\\d{2})<\\/span>/,\n ),\n html.match(\n /Abholzeit:<\\/b>\\s+<span>(\\d{1,2}:\\d{2}) - (\\d{1,2}:\\d{2}) (\\w+)/,\n ),\n html.match(/Anzahl: (\\d+)/),\n html.match(/Anzahl:<\\/b>\\s+<span>(\\d+)/),\n html.match(/Gesamtpreis: ([\\d,.]+)[^\\d,.]/),\n html.match(/Gesamtpreis:<\\/b>\\s+<span>([\\d,.]+)[^\\d,.]/),\n html.match(/Standort:<\\/b>\\s+<span>([^<]+)/),\n ];\n if (!matches[0]) {\n throw new Error('Order ID not found!');\n }\n if (!matches[1]) {\n throw new Error('Location name not found!');\n }\n if (!matches[2] && !matches[3] && !(matches[4] && matches[5])) {\n throw new Error('Date, time and address not found (1)!');\n }\n\n let timezone = 'MET';\n if (matches[2]) {\n timezone = matches[2][4];\n }\n if (matches[5]) {\n timezone = matches[5][3];\n }\n if (timezone === 'MEZ') {\n timezone = 'MET';\n }\n\n const now = moment(email.date);\n let from: moment.Moment | undefined;\n let to: moment.Moment | undefined;\n let address: string | undefined;\n\n if (matches[2]) {\n from = moment.tz(\n matches[2][1] + ' ' + matches[2][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[2][1] + ' ' + matches[2][3],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n address = matches[2][5].trim();\n }\n if (matches[3]) {\n const year = now.year();\n from = moment.tz(\n matches[3][1] + '.' + year + ' ' + matches[3][2],\n 'DD.MM.YYYY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[3][1] + '.' + year + ' ' + matches[3][3],\n 'DD.MM.YYYY HH:mm',\n timezone,\n );\n address = matches[3][4].trim();\n\n if (from.isBefore(now)) {\n from.add(1, 'year');\n }\n if (to.isBefore(from)) {\n to.add(1, 'year');\n }\n }\n if (matches[4] && matches[5] && matches[10]) {\n from = moment.tz(\n matches[4][1] + ' ' + matches[5][1],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n to = moment.tz(\n matches[4][1] + ' ' + matches[5][2],\n 'DD.MM.YY HH:mm',\n timezone,\n );\n address = matches[10][1].trim();\n }\n\n if (!from || !to || !address) {\n throw new Error('Date, time or address not found (2)!');\n }\n\n let amount = 0;\n if (matches[6]) {\n amount = parseInt(matches[6][1], 10);\n } else if (matches[7]) {\n amount = parseInt(matches[7][1], 10);\n } else {\n throw new Error('Amount not found!');\n }\n if (isNaN(amount)) {\n throw new Error('Amount (1) is not a number!');\n }\n\n let price = 0;\n if (matches[8]) {\n price = parseInt(matches[8][1].replace(/[.|,]/g, ''));\n } else if (matches[9]) {\n price = parseInt(matches[9][1].replace(/[.|,]/g, ''));\n } else {\n throw new Error('Price not found!');\n }\n if (isNaN(price)) {\n throw new Error('Price is not a number!');\n }\n\n let name = he.decode(matches[1][1].trim());\n if (name.endsWith('!')) {\n name = name.slice(0, -1);\n }\n\n return {\n amount,\n location: {\n address: he.decode(address),\n name,\n },\n orderId: matches[0][1].trim(),\n price,\n time: {\n from,\n order: now,\n to,\n },\n type: 'order',\n };\n }\n}\n","export const DEFAULT_EMOJI = '🍴';\nexport const EMOJIS: Record<string, RegExp[]> = {\n '🌭': [/Ikea/],\n '🌮': [/Enchilada/, /Besitos/],\n '🍔': [\n /Burger/,\n /McDonald[‘|']?s/,\n /Burger King/,\n /Hans im Glück/,\n /Peter Pane/,\n ],\n '🍕': [\n /Domino‘s/,\n /Pizza Hut/,\n /L[‘|']Osteria/,\n /Call a Pizza/,\n /Smiley[‘|']s Pizza/,\n ],\n '🍗': [/KFC/],\n '🍝': [/LaTagliatella/, /Vapiano/],\n '🍤': [/Nordsee/],\n '🍩': [/Donut/, /Dunkin/],\n '🍪': [/Starbucks/],\n '🥐': [/LeCroBag/],\n '🥖': [\n /Bäckerei/,\n /Back/,\n /BackWerk/,\n /Kamps/,\n /Kamps Backstuben/,\n /Junge Die Bäckerei/,\n /Back-Factory/,\n ],\n '🥗': [/dean ?& ?david/],\n '🥨': [/Brezel/, /Ditsch/],\n '🥩': [/Steakhouse/, /Block House/, /Jim Block/],\n '🥪': [\n /Sandwich/,\n /Tank ?& ?Rast/,\n /T&R Raststätten/,\n /Autohöfe/,\n /Aral/,\n /Shell/,\n /Jet Tank/,\n /Subway/,\n /Caf[é|e] bonjour/,\n /Total Deutschland/,\n /Esso:? Snack ?& ?Shop/,\n ],\n '🛒': [\n /Edeka/,\n /Netto/,\n /Rewe/,\n /Penny/,\n /Lidl/,\n /Kaufland/,\n /Aldi/,\n /dm/,\n /Rossmann/,\n /Globus/,\n /Metro/,\n /Norma/,\n /Tegut/,\n ],\n};\n\nexport default function getEmoji(location: string): null | string {\n for (const emoji in EMOJIS) {\n const regExps = EMOJIS[emoji].map((name) => new RegExp(name, 'i'));\n const match = !!regExps.find((regExp) => regExp.test(location));\n if (match) {\n return emoji;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":["PrismaMariaDb","path","fileURLToPath","runtime","config","decodeBase64AsWasm","wasmBase64","Buffer","wasmArray","wasm","getPrismaClientClass","runtime","getExtensionContext","NullTypes","TransactionIsolationLevel","defineExtension","fileURLToPath","PrismaClient","getPrismaClientClass","databaseUrlStr","databaseUrl","prismaAdapter","PrismaMariaDb","prisma","PrismaClient","db_default","init","readFileSync","dirname","resolve","fileURLToPath","dir","src","path","version","error","config_default","captureException","he","simpleParser","moment","EMOJIS","getEmoji","location","emoji","name","regExp","Parser","address","response","config_default","resolve","data","mail","parsed","db_default","error","errorId","captureException","email","baseMailPostfix","simpleParser","to","received","regexp","r","match","order","change","cancellation","invoice","mails","users","moment","user","location","prefix","input","emoji","getEmoji","latitude","longitude","matches","timezone","from","html","now","year","amount","price","name","he"]}