@aiquants/daily-report 0.18.2 → 0.20.0
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.
- package/README.md +8 -0
- package/dist/server.d.mts +17 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.js +10 -10
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +10 -10
- package/dist/server.mjs.map +1 -1
- package/package.json +10 -9
- package/src/client/components/daily-report-resize-panels.spec.tsx +3 -1
- package/src/server/service.ts +23 -2
- package/src/server/transaction-retry.spec.ts +63 -0
package/dist/server.mjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
var It=t=>{throw TypeError(t)};var At=(t,e,r)=>e.has(t)||It("Cannot "+r);var Ve=(t,e,r)=>(At(t,e,"read from private field"),r?r.call(t):e.get(t)),it=(t,e,r)=>e.has(t)?It("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),lt=(t,e,r,s)=>(At(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);var Tt=t=>({async getEpoch(e){try{let r=await t?.getClient();if(!r)return null;let s=await r.get(e);return s?Number(s):0}catch{return null}},async incrementEpoch(e){try{let r=await t?.getClient();if(!r)return;await r.incr(e)}catch{}}}),Xe=class{constructor(e,r){this.config=e;this.epochStore=r;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let r=e.refreshAheadRatio;if(r===void 0)return;let{cacheKey:s}=e,d=this.buckets.get(s);if(!d)return;let l=e.ttlMsOverride??this.config.defaultTtlMs;if(l-(d.expireAt-Date.now())<l*r||this.inFlight.has(s))return;let p;p=(async()=>{let x=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null,i=await e.fetcher();return this.inFlight.get(s)===p&&this.buckets.set(s,{records:i,expireAt:Date.now()+l,epoch:x}),i})(),this.inFlight.set(s,p),p.catch(()=>{}).finally(()=>{this.inFlight.get(s)===p&&this.inFlight.delete(s)})};this.getOrFetch=async e=>{let{cacheKey:r,forceRefresh:s,snapshot:d}=e,l=this.buckets.get(r);if(s&&(this.buckets.delete(r),this.inFlight.delete(r)),!s&&l&&l.expireAt>Date.now())if(e.epochKey){let p=await this.epochStore.getEpoch(e.epochKey);if(p===null||l.epoch===p)return this.maybeRefreshAhead(e),d?l.records.map(x=>structuredClone(x)):l.records;this.buckets.delete(r)}else return this.maybeRefreshAhead(e),d?l.records.map(p=>structuredClone(p)):l.records;if(!s&&this.inFlight.has(r)){let p=await this.inFlight.get(r);return d?p.map(x=>structuredClone(x)):p}let D;D=(async()=>{let p=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null;e.onFetchStart?.();let x=await e.fetcher();if(s||this.inFlight.get(r)===D){let i=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(r,{records:x,expireAt:i,epoch:p}),this.buckets.size>500&&this.cleanExpired()}return x})(),s||this.inFlight.set(r,D);try{let p=await D;return d?p.map(x=>structuredClone(x)):p}finally{this.inFlight.get(r)===D&&this.inFlight.delete(r)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let r of this.buckets.keys())r.startsWith(e)&&this.buckets.delete(r);for(let r of this.inFlight.keys())r.startsWith(e)&&this.inFlight.delete(r)}}cleanExpired(){let e=Date.now();for(let[r,s]of this.buckets.entries())s.expireAt<=e&&this.buckets.delete(r)}};var or=/^\d{4}-\d{2}-\d{2}$/,ir=/^\d{4}\/\d{2}\/\d{2}$/,Ct=t=>t<10?`0${t}`:`${t}`,_t=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),r=Ct(t.getMonth()+1),s=Ct(t.getDate());return`${e}-${r}-${s}`};var ue=t=>{if(t==null)return null;if(t instanceof Date)return _t(t);let e=t.trim();if(e==="")return null;if(or.test(e))return e;if(ir.test(e))return e.replaceAll("/","-");let r=new Date(e);return _t(r)};var ut=t=>{let e=2166136261,r=-624069552;for(let s of t){let d=s.reportHubId;e^=d&255,e=Math.imul(e,16777619),e^=d>>>8&255,e=Math.imul(e,16777619),e^=d>>>16&255,e=Math.imul(e,16777619),e^=d>>>24&255,e=Math.imul(e,16777619),r^=d>>>24&255,r=Math.imul(r,16777619),r^=d>>>16&255,r=Math.imul(r,16777619),r^=d>>>8&255,r=Math.imul(r,16777619),r^=d&255,r=Math.imul(r,16777619);let l=s.businessDate;if(l===null)e^=1,e=Math.imul(e,16777619),r^=1,r=Math.imul(r,16777619);else for(let D=0;D<l.length;D++){let p=l.charCodeAt(D);e^=p&255,e=Math.imul(e,16777619),r^=p&255,r=Math.imul(r,16777619)}}return e^=t.length,e=Math.imul(e,16777619),r^=t.length,r=Math.imul(r,16777619),((e>>>0).toString(16).padStart(8,"0")+(r>>>0).toString(16).padStart(8,"0")).replace(/^0+(?=.)/,"")},We=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId,vt=t=>{for(let e=1;e<t.length;e++)if(We(t[e-1],t[e])>0)return!1;return!0};var xt=(t,e)=>{let r=t.findIndex(s=>We({businessDate:s.businessDate,reportHubId:s.reportHubId},e)>0);return r===-1?t.length:r};var ye=(t,e,r=console)=>{let s=d=>typeof d=="string"?[`${e} ${d}`]:[e,d];return{debug:(d,...l)=>{t<=0&&r.debug(...s(d),...l)},info:(d,...l)=>{t<=1&&r.info(...s(d),...l)},warn:(d,...l)=>{t<=2&&r.warn(...s(d),...l)},error:(d,...l)=>{t<=3&&r.error(...s(d),...l)}}};import{z as c}from"zod";var lr=c.object({name:c.string().nullish(),affiliation:c.string().nullish()}),ur=c.object({name:c.string().nullish(),text:c.string().nullish(),color:c.string().nullish()}),dr=c.object({id:c.number(),name:c.string().nullish(),color:c.string().nullish()}),kt=c.object({id:c.number(),userId:c.string().nullish(),userName:c.string().nullish(),content:c.string().nullish(),createdAt:c.string().nullish(),isMine:c.boolean()}),cr=c.object({id:c.string(),fileName:c.string(),fileType:c.string().nullable(),fileSize:c.number().nullable(),createdAt:c.string().nullable(),state:c.enum(["present","absent","unknown"])}),dt=c.object({reportHubId:c.number(),date:c.string().nullish(),createdAt:c.string().nullish(),author:c.string().nullish(),userId:c.string().nullish(),sourceType:c.string().nullish(),employeeName:c.string().nullish(),updatedBy:c.string().nullish(),updatedAt:c.string().nullish(),category:c.string().nullish(),creationCategory:c.string().nullish(),visitTimeFrom:c.string().nullish(),visitTimeTo:c.string().nullish(),customerName:c.string().nullish(),interviewers:c.array(lr),subject:c.string().nullish(),content:c.string().nullish(),externalComments:c.array(ur),isRead:c.boolean(),isStarred:c.boolean(),labels:c.array(dr),postedComments:c.array(kt),attachments:c.array(cr).default([])}),pr=c.object({type:c.literal("connected")}),Ze=c.object({type:c.literal("status-update"),reportHubId:c.number(),statusType:c.enum(["star","read"]),value:c.boolean(),clientTempId:c.string(),recipientRawUserId:c.number().optional()}),ct=c.string().optional(),pt=c.object({type:c.literal("comment-add"),reportHubId:c.number(),comment:kt,clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:ct}),mt=c.object({type:c.literal("comment-delete"),reportHubId:c.number(),commentId:c.number(),clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:ct}),yt=c.object({type:c.literal("report-create"),reportHubId:c.number(),report:dt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),ht=c.object({type:c.literal("report-update"),reportHubId:c.number(),report:dt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),ft=c.object({type:c.literal("report-publish"),reportHubId:c.number(),report:dt,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),bt=c.object({type:c.literal("report-delete"),reportHubId:c.number(),clientTempId:c.string(),sourceType:ct}),Et=c.discriminatedUnion("type",[pr,Ze,pt,mt,yt,ht,ft,bt]);import{createHash as mr}from"crypto";var gt=t=>{let e=JSON.stringify(t);return`"${mr("sha256").update(e).digest("hex")}"`};var yr=ye(1,"[Response]"),be=(t,e,r,s=200,d=yr)=>{let l=gt(r),D=t.headers.get("If-None-Match");d.info(`[jsonResponseWithETag] ETag: ${l}, If-None-Match: ${D}`);let p=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:l});return e&&p.append("Set-Cookie",e),t.method==="GET"&&s===200&&D===l?new Response(null,{status:304,headers:p}):new Response(JSON.stringify(r),{status:s,headers:p})};import{EventEmitter as hr}from"events";var Ke=(t,e)=>{let[r,s]=t.split("-").map(Number),[d,l]=e.split("-").map(Number);return r!==d?r<d:s<=l},tt=class{constructor(e){this.config=e;this._emitter=new hr;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??ye(1,"[SSE Reader]")}subscribe(e,r){return this._emitter.on("entry",e),r&&this._emitter.on("error",r),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),r&&this._emitter.removeListener("error",r),this._refCount--,this._refCount<=0&&(this._refCount=0,this._stopLoop())}}async destroy(){this._refCount=0,await this._stopLoop(),this._emitter.removeAllListeners(),this._lastId="$"}async _startLoop(){for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50));if(this._state!=="running"&&this._refCount!==0){this._state="running";try{this._client=await this.config.redis?.createClient()}catch(e){this._state="idle",this._emitError(e instanceof Error?e:new Error("Failed to create Redis client for SSE reader"));return}if(!this._client){this._state="idle",this._emitError(new Error("Failed to create Redis client for SSE reader"));return}if(this._client.on("error",e=>{this._logger.error("Redis client error:",e)}),this._lastId==="$")try{let e=await this.config.redis?.getClient();if(e){let r=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=r.length>0?r[0].id:"0-0"}}catch(e){this._logger.warn("Failed to resolve stream tail anchor; falling back to $:",e)}try{for(;this._state==="running"&&this._client?.isOpen;){let e=await this._client.xRead([{key:this.config.streamKey,id:this._lastId}],{BLOCK:5e3,COUNT:100});if(e)for(let r of e)for(let s of r.messages){this._lastId=s.id;try{let d=s.message?.data?JSON.parse(s.message.data):null,l=d?.type;if((l==="report-create"||l==="report-delete"||l==="report-publish")&&this.config.cache.invalidatePrefix("daily-report:ids"),l==="comment-add"||l==="comment-delete"||l==="status-update"){let D=d?.reportHubId;typeof D=="number"&&(this.config.cache.invalidate(`daily-report:detail:${D}`),this.config.cache.invalidatePrefix(`daily-report:detail:${D}:user:`))}}catch{}this._emitter.emit("entry",{id:s.id,message:s.message})}}}catch(e){!(e?.constructor?.name==="ClientClosedError")&&this._state==="running"&&(this._logger.error("xRead loop error:",e),this._emitError(e instanceof Error?e:new Error(String(e))))}finally{if(this._client?.isOpen)try{await this._client.quit()}catch{}this._client=void 0,this._state="idle",this._refCount>0&&this._startLoop()}}}async _stopLoop(){if(this._state==="running"){if(this._state="stopping",this._client?.isOpen)try{await this._client.quit()}catch{}for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50))}}_emitError(e){this._emitter.listenerCount("error")>0?this._emitter.emit("error",e):this._logger.error("SSE reader error (no error listeners):",e)}};import{inArray as fr,sql as Mt}from"drizzle-orm";var br="",gr=64,Rr=t=>t.toLowerCase(),Dr=t=>t.trim().toLowerCase();function Nt(t){if(t==null)return null;if(!Array.isArray(t))return new Set;let e=new Set;for(let r of t){if(typeof r!="string")continue;let s=Dr(r);s.length>0&&e.add(s)}return e}function we(t,e){return t===null?!0:e==null?!1:t.has(Rr(e))}function ke(t){return t!==null&&t.size===0}function Pt(t,e){if(e!==null)return e.size===0?Mt`1 = 0`:fr(Mt`LOWER(${t})`,[...e])}var $e,Be,je=class je{constructor(e,r){it(this,$e);it(this,Be);lt(this,$e,e),lt(this,Be,r)}get visible(){return Ve(this,$e)===null?null:new Set(Ve(this,$e))}get commentable(){return Ve(this,Be)===null?null:new Set(Ve(this,Be))}static restrictTo(e){let r=typeof e=="object"&&e!==null&&"read"in e,s=Nt(r?e.read:e),d=r?e.comment:void 0;if(d===void 0)return new je(s,s);let l=Nt(d),D=new Set;for(let p of l??[])s.has(p)&&D.add(p);return new je(s,D)}static unrestricted(e){return new je(null,null)}};$e=new WeakMap,Be=new WeakMap;var ge=je;function Je(t){let e=Lt(t.visible),r=Lt(t.commentable);return e===r?e:`d:${e.length}:${e}${r}`}function Lt(t){if(t===null)return"all";if(t.size===0)return"none";let e=[...t].sort().map(s=>`${s.length}:${s}`).join(br);if(e.length<=gr)return`s:${e}`;let r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=Math.imul(r,16777619);return`sh:${(r>>>0).toString(16)}`}var wr=(t,e)=>{let r=new Headers({"Content-Type":"application/json"});return e?.setCookie&&r.append("Set-Cookie",e.setCookie),new Response(JSON.stringify(t),{status:e?.status??200,headers:r})},rt=30,Ot=4e3,Sr="stream interrupted by server error",Ir=/^\d{4}-\d{2}-\d{2}$/,Ar=15e3,$t=Symbol("ids-stream-heartbeat"),Tr=12,Cr=/^[0-9a-f]{1,16}$/,_r=t=>{let e=t.searchParams.get("cursor_report_hub_id"),r=t.searchParams.get("cursor_business_date"),s=t.searchParams.get("cursor_snapshot"),d=s!==null&&Cr.test(s)?s:null;if(e===null)return r===null?{cursor:null,snapshot:d}:{invalid:!0};let l=Number.parseInt(e,10);return!Number.isSafeInteger(l)||String(l)!==e||l<=0?{invalid:!0}:r===null?{cursor:{businessDate:null,reportHubId:l},snapshot:d}:Ir.test(r)?{cursor:{businessDate:r,reportHubId:l},snapshot:d}:{invalid:!0}};async function*Bt(t,e,r,s){let d=e?xt(t,e):0,l=!0;for(;;){let D=t.slice(d,d+(l?r:Ot));d+=D.length;let p=d>=t.length,x=D[D.length-1];if(yield{kind:"chunk",items:D,nextCursor:p||!x?null:{businessDate:x.businessDate,reportHubId:x.reportHubId},isLast:p,...l?{total:t.length}:{},snapshot:s.snapshot,...l&&s.restarted?{restarted:!0}:{}},l=!1,p)return}}var Ut=(t,e,r,s)=>{let d=new TextEncoder,l=!1,D=null,p=new ReadableStream({async pull(i){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}let U=null;try{D===null&&(D=e.next());let m=new Promise(fe=>{U=setTimeout(()=>fe($t),Ar)}),V=await Promise.race([D,m]);if(U!==null&&(clearTimeout(U),U=null),V===$t){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(d.encode(`
|
|
2
|
-
`));return}
|
|
3
|
-
`))}catch(m){if(
|
|
4
|
-
`)),i.close()}catch{}}},cancel(){l=!0,e.return(void 0).catch(()=>{})}}),x=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&x.append("Set-Cookie",t),new Response(p,{status:200,headers:x})},vr=32*1024*1024,xr=60,kr=4,Er=12e4,Mr=1024,Nr=60,Lr=5,Pr=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),$r=/^[\x20-\x7E]+$/,Br=/^[\w.+-]+\/[\w.+-]+/,Ht=t=>t&&$r.test(t)&&Br.test(t)?t:null,Ur=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),Hr=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),Or=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},Yr={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},Fr=t=>{let e=new Map;return(r,s)=>{let d=e.get(r);d&&e.delete(r);let l=d??{tokens:t,lastRefillMs:s},D=Math.max(0,s-l.lastRefillMs);D>0&&(l.tokens=Math.min(t,l.tokens+D*t/6e4),l.lastRefillMs=s);let p=l.tokens>=1;for(p&&(l.tokens-=1),e.set(r,l);e.size>Mr;){let x=e.keys().next();if(x.done)break;e.delete(x.value)}return p}},qr=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},zr=(t,e,r)=>{let s=setTimeout(e,r);s.unref?.();let d=()=>{clearTimeout(s),e()},l=!1;return new ReadableStream({pull(D){if(l){D.close(),d();return}l=!0,D.enqueue(t)},cancel(){d()}})},Vr=(t,e,r,s)=>{if(r===null&&s===null)return!0;let d=typeof e.sourceType=="string"?e.sourceType:void 0;switch(t.type){case"connected":case"status-update":return!0;case"report-create":case"report-update":case"report-publish":return we(r,t.report.sourceType);case"comment-add":case"comment-delete":return we(s,d??"Internal");case"report-delete":return we(r,d)}},Kr=["externalComments","postedComments"],jr=(t,e,r)=>{if(r===null||t.type!=="report-create"&&t.type!=="report-update"&&t.type!=="report-publish"||we(r,t.report.sourceType))return!1;let s=e.report;if(typeof s!="object"||s===null)return!1;let d=s;for(let l of Kr)d[l]=[];return!0};function Yt(t){let{authenticate:e,service:r,encodeUserId:s,redis:d,sseReader:l,streamKey:D}=t,p=t.loginRedirectPath??"/auth/login",x=t.logger??ye(3,"[DailyReportAPI]"),i=t.logger??ye(3,"[DailyReportVisibility]"),U=t.logger??ye(1,"[DailyReportSSE]"),m=t.logger??ye(1,"[DailyReportAttachment]"),V=t.attachmentMaxBytes??vr,K=Fr(t.attachmentRateLimitPerMinute??xr),H=qr(t.attachmentConcurrency??kr),fe=async(S,q="initial")=>{let A=t.resolveVisibleSourceTypes;if(!A)return ge.unrestricted("no visibility port injected: this deployment does not restrict by source type");try{let T=await A(S,{reason:q});return T==null?ge.unrestricted("visibility port returned null/undefined: this deployment opts out of source-type filtering"):ge.restrictTo(T)}catch(T){return i.error("resolveVisibleSourceTypes threw; failing closed (deny all)",T),ge.restrictTo([])}},Ye=async({request:S})=>{let{user:q,cookie:A}=await e(S,{failureRedirect:p}),T=new Headers;A&&T.append("Set-Cookie",A);let h=await r.getUserIdByExternalId(q.id),N=h?s(h):null;return{data:{user:q,userId:N},headers:T}},Fe={"business-date":async(S,q,A,T,h)=>{let N=ue(S.searchParams.get("businessDate")),O=S.searchParams.get("forceRefresh")==="true";if(!N)return be(A,q,{error:{message:"Invalid business date"}},400);let g=await r.getDailyReportsByBusinessDateByExternalId(h,N,T.id,{forceRefresh:O});return be(A,q,{businessDate:N,reports:g},200)},"ids-stream":async(S,q,A,T,h)=>{let N=_r(S);if("invalid"in N)return be(A,q,{error:{message:"Invalid cursor"}},400);let O=S.searchParams.get("forceRefresh")==="true",g=!1,L=null,k=null,Y=new Promise(($,M)=>{L=$,k=M});Y.catch(()=>{});let he=r.getDailyReportIdsByExternalId(h,T.id,{forceRefresh:O,onFetchStart:N.cursor?void 0:()=>{g=!0,r.getDailyReportIdsFirstPageByExternalId(h,T.id,rt).then($=>L?.($),$=>k?.($))}});if(he.catch(()=>{}),N.cursor){let $=await he,M=ut($),_=N.snapshot!==null&&N.snapshot===M;return Ut(q,Bt($,_?N.cursor:null,rt,{snapshot:M,restarted:!_}),A,x)}let E=(async function*(){let $=await Promise.race([he.then(F=>({kind:"full",items:F}),F=>({kind:"full-error",error:F})),Y.then(F=>({kind:"page",items:F}),()=>({kind:"page-error"}))]),M=null,_=!1;if($.kind==="full")M=$.items;else if($.kind==="page"){let F=$.items;if(F.length<rt){yield{kind:"chunk",items:F,nextCursor:null,isLast:!0,total:F.length};return}yield{kind:"chunk",items:F,nextCursor:null,isLast:!1,provisional:!0},_=!0}else if($.kind==="full-error"&&g){let F=await Y.catch(()=>null);F&&F.length>0&&(yield{kind:"chunk",items:F,nextCursor:null,isLast:!1,provisional:!0})}M===null&&(M=await he),yield*Bt(M,null,_?Ot:rt,{snapshot:ut(M)})})();return Ut(q,E,A,x)},report:async(S,q,A,T,h)=>{let N=S.searchParams.get("reportHubId"),O=S.searchParams.get("forceRefresh")==="true",g=N?Number.parseInt(N,10):NaN;if(!Number.isFinite(g)||g<=0)return be(A,q,{error:{message:"Invalid reportHubId"}},400);let L=await r.getDailyReportDetailByIdByExternalId(h,g,T.id,{snapshot:!0,forceRefresh:O});return L?be(A,q,{report:L},200):be(A,q,{error:{message:"Report not found"}},404)}};return{index:{loader:Ye},api:{loader:async({request:S,params:q})=>{let{user:A,cookie:T}=await e(S,{failureRedirect:null}),h=T??null;if(!A)return be(S,h,{error:{message:"Unauthorized"}},401);if(S.method!=="GET")return be(S,h,{error:{message:"Method not allowed"}},405);let N=q.endpoint??"",O=Fe[N];if(!O)return be(S,h,{error:{message:"Unknown endpoint"}},404);let g=Date.now();try{let L=new URL(S.url),k=await fe(S);return await O(L,h,S,A,k)}catch(L){let k=Date.now()-g,Y=L instanceof Error?L:new Error(String(L));return x.error(`500 endpoint=${N} elapsed=${k}ms name=${Y.name} code=${"code"in Y?Y.code:"N/A"} message=${Y.message}`),x.error("Stack:",Y.stack),be(S,h,{error:{message:"Internal Server Error"}},500)}},action:async({request:S,params:q})=>{let{user:A,cookie:T}=await e(S,{failureRedirect:null}),h=(O,g)=>wr(O,{...g,setCookie:T});if(!A)return h({error:"Unauthorized"},{status:401});let N=Date.now();try{if(q.endpoint!=="action")return h({error:"Unknown endpoint"},{status:404});let g=await r.getUserIdByExternalId(A.id);if(!g)return h({error:"User not found"},{status:404});let L=await fe(S),k=await S.formData(),Y=k.get("intent"),he=k.get("reportHubId"),E=he?Number(he):NaN,$=k.get("businessDate"),M=Number(k.get("operationTimestamp")),_=k.get("clientTempId");if(Y==="clearCache")return t.enableDevCacheClear?(await r.clearCache(),h({status:"OK",intent:"clearCache"})):h({error:"Invalid intent"},{status:400});if(!_)return h({error:"clientTempId required"},{status:400});if(Y!=="create"&&(!E||Number.isNaN(E)))return h({error:"Invalid reportHubId"},{status:400});let F=async(w,B,ee)=>{let Se=k.get(B);if(Se===null)return h({error:`${B} required`},{status:400});try{let pe=await ee(Se==="true");return h({status:"OK",intent:w,updatedStatus:{isStarred:pe.isStarred,isRead:pe.isRead},operationTimestamp:M,reportHubId:String(E),clientTempId:_})}catch(pe){if(pe instanceof Error&&pe.message==="Not Found")return h({error:"Report not found"},{status:404});throw pe}};switch(Y){case"create":{if(!$)return h({error:"businessDate required"},{status:400});let w=await r.createDailyReport(g,$,_);return h({status:"OK",intent:"create",report:w,reportHubId:String(w.reportHubId),clientTempId:_})}case"update":{let w=k.get("title"),B=k.get("content");try{return await r.updateDailyReport(E,g,{title:w,content:B},_),h({status:"OK",intent:"update",reportHubId:String(E),clientTempId:_})}catch(ee){if(ee instanceof Error){if(ee.message==="Unauthorized")return h({error:"Unauthorized"},{status:403});if(ee.message==="Not Found")return h({error:"Report not found"},{status:404})}throw ee}}case"publish":try{let w=await r.publishDailyReport(E,g,_);return h({status:"OK",intent:"publish",reportHubId:String(E),clientTempId:_,report:w})}catch(w){if(w instanceof Error){if(w.message==="Unauthorized")return h({error:"Unauthorized"},{status:403});if(w.message==="Not Found")return h({error:"Report not found"},{status:404})}throw w}case"delete":try{return await r.deleteDailyReport(E,g,_),h({status:"OK",intent:"delete",reportHubId:String(E),clientTempId:_})}catch(w){if(w instanceof Error){if(w.message==="Unauthorized")return h({error:"Unauthorized"},{status:403});if(w.message==="Not Found")return h({error:"Report not found"},{status:404})}throw w}case"toggleStar":return await F("toggleStar","isStarred",w=>r.setStarStatus(L,g,E,$,w,_));case"toggleRead":return await F("toggleRead","isRead",w=>r.setReadStatus(L,g,E,$,w,_));case"addComment":{let w=k.get("content");if(!w)return h({error:"Content required"},{status:400});try{let B=await r.addComment(L,g,E,w,$,_),ee={...B,userId:B.userId};return h({status:"OK",intent:"addComment",newComment:ee,reportHubId:String(E),clientTempId:_})}catch(B){if(B instanceof Error){if(B.message==="Not Found")return h({error:"Report not found"},{status:404});if(B.message.startsWith("Comments are restricted"))return h({error:"Comments are restricted for this report"},{status:403})}throw B}}case"deleteComment":{let w=Number(k.get("commentId"));if(!w||Number.isNaN(w))return h({error:"Invalid commentId"},{status:400});try{return await r.deleteComment(L,g,E,w,$,_),h({status:"OK",reportHubId:String(E),deletedCommentId:String(w),clientTempId:_})}catch(B){if(B instanceof Error){if(B.message==="Unauthorized")return h({error:"Unauthorized"},{status:403});if(B.message==="Not Found")return h({error:"Comment not found"},{status:404})}throw B}}default:return h({error:"Invalid intent"},{status:400})}}catch(O){if(O instanceof Response)throw O;let g=Date.now()-N,L=O instanceof Error?O:new Error(String(O));return x.error(`500 action elapsed=${g}ms name=${L.name} message=${L.message}`),x.error("Stack:",L.stack),h({error:"Internal Server Error"},{status:500})}}},sse:{loader:async({request:S,params:q})=>{let{user:A,cookie:T}=await e(S,{failureRedirect:null}),h=se=>T===void 0?se:{...se??{},"Set-Cookie":T};if(!A)return new Response("Unauthorized",{status:401,headers:h()});let N=await r.getUserIdByExternalId(A.id);if(!N)return new Response("Forbidden",{status:403,headers:h()});if(q.endpoint!=="updates")return new Response("Not Found",{status:404,headers:h()});let O=await fe(S),g=O.visible,L=O.commentable,k=0,Y=0,E=new URL(S.url).searchParams.get("lastEventId")||S.headers.get("Last-Event-ID"),$=new TextEncoder,M=null,_=null,F=null,w=!1,B=()=>{if(!w){if(w=!0,_&&(clearInterval(_),_=null),F&&(F(),F=null),M)try{M.desiredSize!==null&&M.close()}catch{}finally{M=null}w=!1}},ee=se=>{M&&M.desiredSize!==null&&M.enqueue($.encode(`id: ${se}
|
|
1
|
+
var Tt=t=>{throw TypeError(t)};var At=(t,e,r)=>e.has(t)||Tt("Cannot "+r);var qe=(t,e,r)=>(At(t,e,"read from private field"),r?r.call(t):e.get(t)),lt=(t,e,r)=>e.has(t)?Tt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),ut=(t,e,r,s)=>(At(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);var Ct=t=>({async getEpoch(e){try{let r=await t?.getClient();if(!r)return null;let s=await r.get(e);return s?Number(s):0}catch{return null}},async incrementEpoch(e){try{let r=await t?.getClient();if(!r)return;await r.incr(e)}catch{}}}),Ge=class{constructor(e,r){this.config=e;this.epochStore=r;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let r=e.refreshAheadRatio;if(r===void 0)return;let{cacheKey:s}=e,d=this.buckets.get(s);if(!d)return;let l=e.ttlMsOverride??this.config.defaultTtlMs;if(l-(d.expireAt-Date.now())<l*r||this.inFlight.has(s))return;let p;p=(async()=>{let x=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null,i=await e.fetcher();return this.inFlight.get(s)===p&&this.buckets.set(s,{records:i,expireAt:Date.now()+l,epoch:x}),i})(),this.inFlight.set(s,p),p.catch(()=>{}).finally(()=>{this.inFlight.get(s)===p&&this.inFlight.delete(s)})};this.getOrFetch=async e=>{let{cacheKey:r,forceRefresh:s,snapshot:d}=e,l=this.buckets.get(r);if(s&&(this.buckets.delete(r),this.inFlight.delete(r)),!s&&l&&l.expireAt>Date.now())if(e.epochKey){let p=await this.epochStore.getEpoch(e.epochKey);if(p===null||l.epoch===p)return this.maybeRefreshAhead(e),d?l.records.map(x=>structuredClone(x)):l.records;this.buckets.delete(r)}else return this.maybeRefreshAhead(e),d?l.records.map(p=>structuredClone(p)):l.records;if(!s&&this.inFlight.has(r)){let p=await this.inFlight.get(r);return d?p.map(x=>structuredClone(x)):p}let R;R=(async()=>{let p=e.epochKey?await this.epochStore.getEpoch(e.epochKey):null;e.onFetchStart?.();let x=await e.fetcher();if(s||this.inFlight.get(r)===R){let i=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(r,{records:x,expireAt:i,epoch:p}),this.buckets.size>500&&this.cleanExpired()}return x})(),s||this.inFlight.set(r,R);try{let p=await R;return d?p.map(x=>structuredClone(x)):p}finally{this.inFlight.get(r)===R&&this.inFlight.delete(r)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let r of this.buckets.keys())r.startsWith(e)&&this.buckets.delete(r);for(let r of this.inFlight.keys())r.startsWith(e)&&this.inFlight.delete(r)}}cleanExpired(){let e=Date.now();for(let[r,s]of this.buckets.entries())s.expireAt<=e&&this.buckets.delete(r)}};var ir=/^\d{4}-\d{2}-\d{2}$/,lr=/^\d{4}\/\d{2}\/\d{2}$/,_t=t=>t<10?`0${t}`:`${t}`,vt=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),r=_t(t.getMonth()+1),s=_t(t.getDate());return`${e}-${r}-${s}`};var ue=t=>{if(t==null)return null;if(t instanceof Date)return vt(t);let e=t.trim();if(e==="")return null;if(ir.test(e))return e;if(lr.test(e))return e.replaceAll("/","-");let r=new Date(e);return vt(r)};var dt=t=>{let e=2166136261,r=-624069552;for(let s of t){let d=s.reportHubId;e^=d&255,e=Math.imul(e,16777619),e^=d>>>8&255,e=Math.imul(e,16777619),e^=d>>>16&255,e=Math.imul(e,16777619),e^=d>>>24&255,e=Math.imul(e,16777619),r^=d>>>24&255,r=Math.imul(r,16777619),r^=d>>>16&255,r=Math.imul(r,16777619),r^=d>>>8&255,r=Math.imul(r,16777619),r^=d&255,r=Math.imul(r,16777619);let l=s.businessDate;if(l===null)e^=1,e=Math.imul(e,16777619),r^=1,r=Math.imul(r,16777619);else for(let R=0;R<l.length;R++){let p=l.charCodeAt(R);e^=p&255,e=Math.imul(e,16777619),r^=p&255,r=Math.imul(r,16777619)}}return e^=t.length,e=Math.imul(e,16777619),r^=t.length,r=Math.imul(r,16777619),((e>>>0).toString(16).padStart(8,"0")+(r>>>0).toString(16).padStart(8,"0")).replace(/^0+(?=.)/,"")},Qe=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId,xt=t=>{for(let e=1;e<t.length;e++)if(Qe(t[e-1],t[e])>0)return!1;return!0};var kt=(t,e)=>{let r=t.findIndex(s=>Qe({businessDate:s.businessDate,reportHubId:s.reportHubId},e)>0);return r===-1?t.length:r};var ye=(t,e,r=console)=>{let s=d=>typeof d=="string"?[`${e} ${d}`]:[e,d];return{debug:(d,...l)=>{t<=0&&r.debug(...s(d),...l)},info:(d,...l)=>{t<=1&&r.info(...s(d),...l)},warn:(d,...l)=>{t<=2&&r.warn(...s(d),...l)},error:(d,...l)=>{t<=3&&r.error(...s(d),...l)}}};import{z as c}from"zod";var ur=c.object({name:c.string().nullish(),affiliation:c.string().nullish()}),dr=c.object({name:c.string().nullish(),text:c.string().nullish(),color:c.string().nullish()}),cr=c.object({id:c.number(),name:c.string().nullish(),color:c.string().nullish()}),Et=c.object({id:c.number(),userId:c.string().nullish(),userName:c.string().nullish(),content:c.string().nullish(),createdAt:c.string().nullish(),isMine:c.boolean()}),pr=c.object({id:c.string(),fileName:c.string(),fileType:c.string().nullable(),fileSize:c.number().nullable(),createdAt:c.string().nullable(),state:c.enum(["present","absent","unknown"])}),ct=c.object({reportHubId:c.number(),date:c.string().nullish(),createdAt:c.string().nullish(),author:c.string().nullish(),userId:c.string().nullish(),sourceType:c.string().nullish(),employeeName:c.string().nullish(),updatedBy:c.string().nullish(),updatedAt:c.string().nullish(),category:c.string().nullish(),creationCategory:c.string().nullish(),visitTimeFrom:c.string().nullish(),visitTimeTo:c.string().nullish(),customerName:c.string().nullish(),interviewers:c.array(ur),subject:c.string().nullish(),content:c.string().nullish(),externalComments:c.array(dr),isRead:c.boolean(),isStarred:c.boolean(),labels:c.array(cr),postedComments:c.array(Et),attachments:c.array(pr).default([])}),mr=c.object({type:c.literal("connected")}),Xe=c.object({type:c.literal("status-update"),reportHubId:c.number(),statusType:c.enum(["star","read"]),value:c.boolean(),clientTempId:c.string(),recipientRawUserId:c.number().optional()}),pt=c.string().optional(),mt=c.object({type:c.literal("comment-add"),reportHubId:c.number(),comment:Et,clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:pt}),yt=c.object({type:c.literal("comment-delete"),reportHubId:c.number(),commentId:c.number(),clientTempId:c.string(),recipientRawUserId:c.number().optional(),sourceType:pt}),ht=c.object({type:c.literal("report-create"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),ft=c.object({type:c.literal("report-update"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),bt=c.object({type:c.literal("report-publish"),reportHubId:c.number(),report:ct,clientTempId:c.string(),recipientRawUserId:c.number().optional()}),gt=c.object({type:c.literal("report-delete"),reportHubId:c.number(),clientTempId:c.string(),sourceType:pt}),Mt=c.discriminatedUnion("type",[mr,Xe,mt,yt,ht,ft,bt,gt]);import{createHash as yr}from"crypto";var Rt=t=>{let e=JSON.stringify(t);return`"${yr("sha256").update(e).digest("hex")}"`};var hr=ye(1,"[Response]"),Re=(t,e,r,s=200,d=hr)=>{let l=Rt(r),R=t.headers.get("If-None-Match");d.info(`[jsonResponseWithETag] ETag: ${l}, If-None-Match: ${R}`);let p=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:l});return e&&p.append("Set-Cookie",e),t.method==="GET"&&s===200&&R===l?new Response(null,{status:304,headers:p}):new Response(JSON.stringify(r),{status:s,headers:p})};import{EventEmitter as fr}from"events";var ze=(t,e)=>{let[r,s]=t.split("-").map(Number),[d,l]=e.split("-").map(Number);return r!==d?r<d:s<=l},Ze=class{constructor(e){this.config=e;this._emitter=new fr;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??ye(1,"[SSE Reader]")}subscribe(e,r){return this._emitter.on("entry",e),r&&this._emitter.on("error",r),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),r&&this._emitter.removeListener("error",r),this._refCount--,this._refCount<=0&&(this._refCount=0,this._stopLoop())}}async destroy(){this._refCount=0,await this._stopLoop(),this._emitter.removeAllListeners(),this._lastId="$"}async _startLoop(){for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50));if(this._state!=="running"&&this._refCount!==0){this._state="running";try{this._client=await this.config.redis?.createClient()}catch(e){this._state="idle",this._emitError(e instanceof Error?e:new Error("Failed to create Redis client for SSE reader"));return}if(!this._client){this._state="idle",this._emitError(new Error("Failed to create Redis client for SSE reader"));return}if(this._client.on("error",e=>{this._logger.error("Redis client error:",e)}),this._lastId==="$")try{let e=await this.config.redis?.getClient();if(e){let r=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=r.length>0?r[0].id:"0-0"}}catch(e){this._logger.warn("Failed to resolve stream tail anchor; falling back to $:",e)}try{for(;this._state==="running"&&this._client?.isOpen;){let e=await this._client.xRead([{key:this.config.streamKey,id:this._lastId}],{BLOCK:5e3,COUNT:100});if(e)for(let r of e)for(let s of r.messages){this._lastId=s.id;try{let d=s.message?.data?JSON.parse(s.message.data):null,l=d?.type;if((l==="report-create"||l==="report-delete"||l==="report-publish")&&this.config.cache.invalidatePrefix("daily-report:ids"),l==="comment-add"||l==="comment-delete"||l==="status-update"){let R=d?.reportHubId;typeof R=="number"&&(this.config.cache.invalidate(`daily-report:detail:${R}`),this.config.cache.invalidatePrefix(`daily-report:detail:${R}:user:`))}}catch{}this._emitter.emit("entry",{id:s.id,message:s.message})}}}catch(e){!(e?.constructor?.name==="ClientClosedError")&&this._state==="running"&&(this._logger.error("xRead loop error:",e),this._emitError(e instanceof Error?e:new Error(String(e))))}finally{if(this._client?.isOpen)try{await this._client.quit()}catch{}this._client=void 0,this._state="idle",this._refCount>0&&this._startLoop()}}}async _stopLoop(){if(this._state==="running"){if(this._state="stopping",this._client?.isOpen)try{await this._client.quit()}catch{}for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50))}}_emitError(e){this._emitter.listenerCount("error")>0?this._emitter.emit("error",e):this._logger.error("SSE reader error (no error listeners):",e)}};import{inArray as br,sql as Nt}from"drizzle-orm";var gr="",Rr=64,Dr=t=>t.toLowerCase(),wr=t=>t.trim().toLowerCase();function Lt(t){if(t==null)return null;if(!Array.isArray(t))return new Set;let e=new Set;for(let r of t){if(typeof r!="string")continue;let s=wr(r);s.length>0&&e.add(s)}return e}function Ie(t,e){return t===null?!0:e==null?!1:t.has(Dr(e))}function ve(t){return t!==null&&t.size===0}function $t(t,e){if(e!==null)return e.size===0?Nt`1 = 0`:br(Nt`LOWER(${t})`,[...e])}var Le,Pe,Ve=class Ve{constructor(e,r){lt(this,Le);lt(this,Pe);ut(this,Le,e),ut(this,Pe,r)}get visible(){return qe(this,Le)===null?null:new Set(qe(this,Le))}get commentable(){return qe(this,Pe)===null?null:new Set(qe(this,Pe))}static restrictTo(e){let r=typeof e=="object"&&e!==null&&"read"in e,s=Lt(r?e.read:e),d=r?e.comment:void 0;if(d===void 0)return new Ve(s,s);let l=Lt(d),R=new Set;for(let p of l??[])s.has(p)&&R.add(p);return new Ve(s,R)}static unrestricted(e){return new Ve(null,null)}};Le=new WeakMap,Pe=new WeakMap;var De=Ve;function Ke(t){let e=Pt(t.visible),r=Pt(t.commentable);return e===r?e:`d:${e.length}:${e}${r}`}function Pt(t){if(t===null)return"all";if(t.size===0)return"none";let e=[...t].sort().map(s=>`${s.length}:${s}`).join(gr);if(e.length<=Rr)return`s:${e}`;let r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=Math.imul(r,16777619);return`sh:${(r>>>0).toString(16)}`}var Sr=(t,e)=>{let r=new Headers({"Content-Type":"application/json"});return e?.setCookie&&r.append("Set-Cookie",e.setCookie),new Response(JSON.stringify(t),{status:e?.status??200,headers:r})},et=30,Yt=4e3,Ir="stream interrupted by server error",Tr=/^\d{4}-\d{2}-\d{2}$/,Ar=15e3,Bt=Symbol("ids-stream-heartbeat"),Cr=12,_r=/^[0-9a-f]{1,16}$/,vr=t=>{let e=t.searchParams.get("cursor_report_hub_id"),r=t.searchParams.get("cursor_business_date"),s=t.searchParams.get("cursor_snapshot"),d=s!==null&&_r.test(s)?s:null;if(e===null)return r===null?{cursor:null,snapshot:d}:{invalid:!0};let l=Number.parseInt(e,10);return!Number.isSafeInteger(l)||String(l)!==e||l<=0?{invalid:!0}:r===null?{cursor:{businessDate:null,reportHubId:l},snapshot:d}:Tr.test(r)?{cursor:{businessDate:r,reportHubId:l},snapshot:d}:{invalid:!0}};async function*Ut(t,e,r,s){let d=e?kt(t,e):0,l=!0;for(;;){let R=t.slice(d,d+(l?r:Yt));d+=R.length;let p=d>=t.length,x=R[R.length-1];if(yield{kind:"chunk",items:R,nextCursor:p||!x?null:{businessDate:x.businessDate,reportHubId:x.reportHubId},isLast:p,...l?{total:t.length}:{},snapshot:s.snapshot,...l&&s.restarted?{restarted:!0}:{}},l=!1,p)return}}var Ht=(t,e,r,s)=>{let d=new TextEncoder,l=!1,R=null,p=new ReadableStream({async pull(i){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}let O=null;try{R===null&&(R=e.next());let m=new Promise(fe=>{O=setTimeout(()=>fe(Bt),Ar)}),V=await Promise.race([R,m]);if(O!==null&&(clearTimeout(O),O=null),V===Bt){if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(d.encode(`
|
|
2
|
+
`));return}R=null;let{value:K,done:Y}=V;if(Y){i.close();return}if(l||r.signal.aborted){await e.return(void 0).catch(()=>{});try{i.close()}catch{}return}i.enqueue(d.encode(`${JSON.stringify(K)}
|
|
3
|
+
`))}catch(m){if(O!==null&&clearTimeout(O),R=null,l||r.signal.aborted)return;s.error(`ids-stream emission failed: ${m instanceof Error?m.message:String(m)}`);try{let V={kind:"error",error:Ir};i.enqueue(d.encode(`${JSON.stringify(V)}
|
|
4
|
+
`)),i.close()}catch{}}},cancel(){l=!0,e.return(void 0).catch(()=>{})}}),x=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&x.append("Set-Cookie",t),new Response(p,{status:200,headers:x})},xr=32*1024*1024,kr=60,Er=4,Mr=12e4,Nr=1024,Lr=60,Pr=5,$r=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),Br=/^[\x20-\x7E]+$/,Ur=/^[\w.+-]+\/[\w.+-]+/,Ot=t=>t&&Br.test(t)&&Ur.test(t)?t:null,Hr=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),Or=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),Yr=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},Fr={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},qr=t=>{let e=new Map;return(r,s)=>{let d=e.get(r);d&&e.delete(r);let l=d??{tokens:t,lastRefillMs:s},R=Math.max(0,s-l.lastRefillMs);R>0&&(l.tokens=Math.min(t,l.tokens+R*t/6e4),l.lastRefillMs=s);let p=l.tokens>=1;for(p&&(l.tokens-=1),e.set(r,l);e.size>Nr;){let x=e.keys().next();if(x.done)break;e.delete(x.value)}return p}},zr=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},Vr=(t,e,r)=>{let s=setTimeout(e,r);s.unref?.();let d=()=>{clearTimeout(s),e()},l=!1;return new ReadableStream({pull(R){if(l){R.close(),d();return}l=!0,R.enqueue(t)},cancel(){d()}})},Kr=(t,e,r,s)=>{if(r===null&&s===null)return!0;let d=typeof e.sourceType=="string"?e.sourceType:void 0;switch(t.type){case"connected":case"status-update":return!0;case"report-create":case"report-update":case"report-publish":return Ie(r,t.report.sourceType);case"comment-add":case"comment-delete":return Ie(s,d??"Internal");case"report-delete":return Ie(r,d)}},jr=["externalComments","postedComments"],Jr=(t,e,r)=>{if(r===null||t.type!=="report-create"&&t.type!=="report-update"&&t.type!=="report-publish"||Ie(r,t.report.sourceType))return!1;let s=e.report;if(typeof s!="object"||s===null)return!1;let d=s;for(let l of jr)d[l]=[];return!0};function Ft(t){let{authenticate:e,service:r,encodeUserId:s,redis:d,sseReader:l,streamKey:R}=t,p=t.loginRedirectPath??"/auth/login",x=t.logger??ye(3,"[DailyReportAPI]"),i=t.logger??ye(3,"[DailyReportVisibility]"),O=t.logger??ye(1,"[DailyReportSSE]"),m=t.logger??ye(1,"[DailyReportAttachment]"),V=t.attachmentMaxBytes??xr,K=qr(t.attachmentRateLimitPerMinute??kr),Y=zr(t.attachmentConcurrency??Er),fe=async(w,U="initial")=>{let k=t.resolveVisibleSourceTypes;if(!k)return De.unrestricted("no visibility port injected: this deployment does not restrict by source type");try{let T=await k(w,{reason:U});return T==null?De.unrestricted("visibility port returned null/undefined: this deployment opts out of source-type filtering"):De.restrictTo(T)}catch(T){return i.error("resolveVisibleSourceTypes threw; failing closed (deny all)",T),De.restrictTo([])}},He=async({request:w})=>{let{user:U,cookie:k}=await e(w,{failureRedirect:p}),T=new Headers;k&&T.append("Set-Cookie",k);let y=await r.getUserIdByExternalId(U.id),$=y?s(y):null;return{data:{user:U,userId:$},headers:T}},Oe={"business-date":async(w,U,k,T,y)=>{let $=ue(w.searchParams.get("businessDate")),F=w.searchParams.get("forceRefresh")==="true";if(!$)return Re(k,U,{error:{message:"Invalid business date"}},400);let _=await r.getDailyReportsByBusinessDateByExternalId(y,$,T.id,{forceRefresh:F});return Re(k,U,{businessDate:$,reports:_},200)},"ids-stream":async(w,U,k,T,y)=>{let $=vr(w);if("invalid"in $)return Re(k,U,{error:{message:"Invalid cursor"}},400);let F=w.searchParams.get("forceRefresh")==="true",_=!1,S=null,A=null,q=new Promise((M,E)=>{S=M,A=E});q.catch(()=>{});let he=r.getDailyReportIdsByExternalId(y,T.id,{forceRefresh:F,onFetchStart:$.cursor?void 0:()=>{_=!0,r.getDailyReportIdsFirstPageByExternalId(y,T.id,et).then(M=>S?.(M),M=>A?.(M))}});if(he.catch(()=>{}),$.cursor){let M=await he,E=dt(M),P=$.snapshot!==null&&$.snapshot===E;return Ht(U,Ut(M,P?$.cursor:null,et,{snapshot:E,restarted:!P}),k,x)}let L=(async function*(){let M=await Promise.race([he.then(N=>({kind:"full",items:N}),N=>({kind:"full-error",error:N})),q.then(N=>({kind:"page",items:N}),()=>({kind:"page-error"}))]),E=null,P=!1;if(M.kind==="full")E=M.items;else if(M.kind==="page"){let N=M.items;if(N.length<et){yield{kind:"chunk",items:N,nextCursor:null,isLast:!0,total:N.length};return}yield{kind:"chunk",items:N,nextCursor:null,isLast:!1,provisional:!0},P=!0}else if(M.kind==="full-error"&&_){let N=await q.catch(()=>null);N&&N.length>0&&(yield{kind:"chunk",items:N,nextCursor:null,isLast:!1,provisional:!0})}E===null&&(E=await he),yield*Ut(E,null,P?Yt:et,{snapshot:dt(E)})})();return Ht(U,L,k,x)},report:async(w,U,k,T,y)=>{let $=w.searchParams.get("reportHubId"),F=w.searchParams.get("forceRefresh")==="true",_=$?Number.parseInt($,10):NaN;if(!Number.isFinite(_)||_<=0)return Re(k,U,{error:{message:"Invalid reportHubId"}},400);let S=await r.getDailyReportDetailByIdByExternalId(y,_,T.id,{snapshot:!0,forceRefresh:F});return S?Re(k,U,{report:S},200):Re(k,U,{error:{message:"Report not found"}},404)}};return{index:{loader:He},api:{loader:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=T??null;if(!k)return Re(w,y,{error:{message:"Unauthorized"}},401);if(w.method!=="GET")return Re(w,y,{error:{message:"Method not allowed"}},405);let $=U.endpoint??"",F=Oe[$];if(!F)return Re(w,y,{error:{message:"Unknown endpoint"}},404);let _=Date.now();try{let S=new URL(w.url),A=await fe(w);return await F(S,y,w,k,A)}catch(S){let A=Date.now()-_,q=S instanceof Error?S:new Error(String(S));return x.error(`500 endpoint=${$} elapsed=${A}ms name=${q.name} code=${"code"in q?q.code:"N/A"} message=${q.message}`),x.error("Stack:",q.stack),Re(w,y,{error:{message:"Internal Server Error"}},500)}},action:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=(F,_)=>Sr(F,{..._,setCookie:T});if(!k)return y({error:"Unauthorized"},{status:401});let $=Date.now();try{if(U.endpoint!=="action")return y({error:"Unknown endpoint"},{status:404});let _=await r.getUserIdByExternalId(k.id);if(!_)return y({error:"User not found"},{status:404});let S=await fe(w),A=await w.formData(),q=A.get("intent"),he=A.get("reportHubId"),L=he?Number(he):NaN,M=A.get("businessDate"),E=Number(A.get("operationTimestamp")),P=A.get("clientTempId");if(q==="clearCache")return t.enableDevCacheClear?(await r.clearCache(),y({status:"OK",intent:"clearCache"})):y({error:"Invalid intent"},{status:400});if(!P)return y({error:"clientTempId required"},{status:400});if(q!=="create"&&(!L||Number.isNaN(L)))return y({error:"Invalid reportHubId"},{status:400});let N=async(D,H,ee)=>{let be=A.get(H);if(be===null)return y({error:`${H} required`},{status:400});try{let pe=await ee(be==="true");return y({status:"OK",intent:D,updatedStatus:{isStarred:pe.isStarred,isRead:pe.isRead},operationTimestamp:E,reportHubId:String(L),clientTempId:P})}catch(pe){if(pe instanceof Error&&pe.message==="Not Found")return y({error:"Report not found"},{status:404});throw pe}};switch(q){case"create":{if(!M)return y({error:"businessDate required"},{status:400});let D=await r.createDailyReport(_,M,P);return y({status:"OK",intent:"create",report:D,reportHubId:String(D.reportHubId),clientTempId:P})}case"update":{let D=A.get("title"),H=A.get("content");try{return await r.updateDailyReport(L,_,{title:D,content:H},P),y({status:"OK",intent:"update",reportHubId:String(L),clientTempId:P})}catch(ee){if(ee instanceof Error){if(ee.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(ee.message==="Not Found")return y({error:"Report not found"},{status:404})}throw ee}}case"publish":try{let D=await r.publishDailyReport(L,_,P);return y({status:"OK",intent:"publish",reportHubId:String(L),clientTempId:P,report:D})}catch(D){if(D instanceof Error){if(D.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(D.message==="Not Found")return y({error:"Report not found"},{status:404})}throw D}case"delete":try{return await r.deleteDailyReport(L,_,P),y({status:"OK",intent:"delete",reportHubId:String(L),clientTempId:P})}catch(D){if(D instanceof Error){if(D.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(D.message==="Not Found")return y({error:"Report not found"},{status:404})}throw D}case"toggleStar":return await N("toggleStar","isStarred",D=>r.setStarStatus(S,_,L,M,D,P));case"toggleRead":return await N("toggleRead","isRead",D=>r.setReadStatus(S,_,L,M,D,P));case"addComment":{let D=A.get("content");if(!D)return y({error:"Content required"},{status:400});try{let H=await r.addComment(S,_,L,D,M,P),ee={...H,userId:H.userId};return y({status:"OK",intent:"addComment",newComment:ee,reportHubId:String(L),clientTempId:P})}catch(H){if(H instanceof Error){if(H.message==="Not Found")return y({error:"Report not found"},{status:404});if(H.message.startsWith("Comments are restricted"))return y({error:"Comments are restricted for this report"},{status:403})}throw H}}case"deleteComment":{let D=Number(A.get("commentId"));if(!D||Number.isNaN(D))return y({error:"Invalid commentId"},{status:400});try{return await r.deleteComment(S,_,L,D,M,P),y({status:"OK",reportHubId:String(L),deletedCommentId:String(D),clientTempId:P})}catch(H){if(H instanceof Error){if(H.message==="Unauthorized")return y({error:"Unauthorized"},{status:403});if(H.message==="Not Found")return y({error:"Comment not found"},{status:404})}throw H}}default:return y({error:"Invalid intent"},{status:400})}}catch(F){if(F instanceof Response)throw F;let _=Date.now()-$,S=F instanceof Error?F:new Error(String(F));return x.error(`500 action elapsed=${_}ms name=${S.name} message=${S.message}`),x.error("Stack:",S.stack),y({error:"Internal Server Error"},{status:500})}}},sse:{loader:async({request:w,params:U})=>{let{user:k,cookie:T}=await e(w,{failureRedirect:null}),y=se=>T===void 0?se:{...se??{},"Set-Cookie":T};if(!k)return new Response("Unauthorized",{status:401,headers:y()});let $=await r.getUserIdByExternalId(k.id);if(!$)return new Response("Forbidden",{status:403,headers:y()});if(U.endpoint!=="updates")return new Response("Not Found",{status:404,headers:y()});let F=await fe(w),_=F.visible,S=F.commentable,A=0,q=0,L=new URL(w.url).searchParams.get("lastEventId")||w.headers.get("Last-Event-ID"),M=new TextEncoder,E=null,P=null,N=null,D=!1,H=()=>{if(!D){if(D=!0,P&&(clearInterval(P),P=null),N&&(N(),N=null),E)try{E.desiredSize!==null&&E.close()}catch{}finally{E=null}D=!1}},ee=se=>{E&&E.desiredSize!==null&&E.enqueue(M.encode(`id: ${se}
|
|
5
5
|
data: ${JSON.stringify({type:"connected"})}
|
|
6
6
|
|
|
7
|
-
`))},
|
|
8
|
-
data: ${
|
|
7
|
+
`))},be=(se,te)=>{if(te.data)try{let Q=JSON.parse(te.data),v=Mt.safeParse(Q);if(!v.success){O.error("SSE message validation failed:",v.error.format());return}let J=v.data,me=typeof Q.recipientRawUserId=="number"?Q.recipientRawUserId:void 0;if(J.type==="status-update"){if(me===void 0||me!==$)return}else if(me!==void 0&&me!==$)return;if(!Kr(J,Q,_,S)){ee(se);return}let nt=Jr(J,Q,S),ge;if("recipientRawUserId"in Q){let{recipientRawUserId:Ye,...Te}=Q;ge=JSON.stringify(Te)}else nt?ge=JSON.stringify(Q):ge=te.data;E&&E.desiredSize!==null&&E.enqueue(M.encode(`id: ${se}
|
|
8
|
+
data: ${ge}
|
|
9
9
|
|
|
10
|
-
`))}catch(
|
|
10
|
+
`))}catch(Q){O.error(`[SSE:${$}] processEntry error:`,Q)}},pe=new ReadableStream({async start(se){E=se,P=setInterval(()=>{try{if(E&&E.desiredSize!==null){if(E.enqueue(M.encode(`: keep-alive
|
|
11
11
|
|
|
12
|
-
`)),++
|
|
12
|
+
`)),++A%Cr===0){let v=++q;fe(w,"refresh").then(J=>{v===q&&(_=J.visible,S=J.commentable)})}}else H()}catch{H()}},5e3),w.signal.addEventListener("abort",()=>{H()});let te=L||"0-0",Q=null;if(N=l.subscribe(v=>{ze(v.id,te)||(Q===null&&(Q=v.id),te=v.id,be(v.id,v.message))},v=>{O.error(`[SSE:${$}] Fan-Out reader error:`,v),H()}),!L)try{let v=await d?.getClient();if(v){let J=await v.xRevRange(R,"+","-",{COUNT:1});J.length>0&&!ze(J[0].id,te)&&(te=J[0].id)}}catch{}if(E&&E.desiredSize!==null){let v=`data: ${JSON.stringify({type:"connected"})}
|
|
13
13
|
|
|
14
|
-
`,
|
|
15
|
-
${v}`:v;M.enqueue($.encode(W))}if(E)try{let v=await d?.getClient();if(v){let W=await v.xRange(D,E,"+",{COUNT:1e3});for(let me of W)me.id!==E&&(J!==null&&Ke(J,me.id)||(Ke(me.id,te)||(te=me.id),Se(me.id,me.message)))}}catch(v){U.error(`[SSE:${N}] catch-up xRange error:`,v)}},cancel(){B()}});return new Response(pe,{headers:h({"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"})})}},attachment:{loader:async({request:S,params:q})=>{let A=null,T=(h,N,O)=>{let g=new Headers({"Content-Type":"application/json"});return O!==void 0&&g.set("Retry-After",String(O)),A&&g.append("Set-Cookie",A),new Response(JSON.stringify({error:{message:N}}),{status:h,headers:g})};try{let{user:h,cookie:N}=await e(S,{failureRedirect:null});if(A=N??null,!h)return T(401,"Unauthorized");if(S.method!=="GET"&&S.method!=="HEAD")return T(405,"Method not allowed");let O=t.attachmentIdCodec,g=t.readAttachment;if(!(O&&g))return T(404,"Attachment not found");let L=q.token??"",k=O.decode(L);if(k===null||!Number.isSafeInteger(k)||k<=0)return T(400,"Invalid attachment token");let Y=await r.getUserIdByExternalId(h.id);if(!Y)return T(403,"Forbidden");if(!K(Y,Date.now()))return m.error(`429 attachment=${k} viewer=${Y} reason=rate_limit`),T(429,"Too many requests",Nr);let he=await fe(S),E=await r.getAttachmentForUser(he,k,Y);if(!E)return m.error(`404 attachment=${k} viewer=${Y} reason=not_visible`),T(404,"Attachment not found");if(E.fileSize!=null&&E.fileSize>V)return m.error(`413 attachment=${k} viewer=${Y} reason=db_size`),T(413,"Attachment too large");if(!H.tryAcquire())return m.error(`503 attachment=${k} viewer=${Y} reason=concurrency`),T(503,"Too many concurrent downloads",Lr);let $=!1,M=()=>{$||($=!0,H.release())},_=!1;try{let F=S.method==="HEAD",w=await g(E.filePath,{maxBytes:V,head:F,principal:s(Y)});if(!w.ok){let v=Or(w.reason);return w.reason==="not_found"&&r.markAttachmentMissing(k).catch(W=>{m.error(`markAttachmentMissing failed attachment=${k} message=${W instanceof Error?W.message:"unknown"}`)}),m.error(`${v} attachment=${k} viewer=${Y} reason=${w.reason} code=${w.code??"-"}`),T(v,Yr[v]??"Attachment storage unavailable")}let B=Ht(E.fileType)??Ht(w.contentType)??"application/octet-stream",ee=Pr.has(B),Se=new URL(S.url).searchParams.get("download")==="1",pe=ee?B:"application/octet-stream",se=ee&&!Se?"inline":"attachment",te=w.size??w.bytes.byteLength,J=new Headers({"Content-Type":pe,"Content-Length":String(te),"Content-Disposition":`${se}; filename="${Hr(E.fileName)}"; filename*=UTF-8''${Ur(E.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return A&&J.append("Set-Cookie",A),r.markAttachmentPresent(k).catch(v=>{m.error(`markAttachmentPresent failed attachment=${k} message=${v instanceof Error?v.message:"unknown"}`)}),m.info(`200 attachment=${k} viewer=${Y} type=${pe} disposition=${se} bytes=${te}`),F?new Response(null,{status:200,headers:J}):(_=!0,new Response(zr(w.bytes,M,Er),{status:200,headers:J}))}finally{_||M()}}catch(h){if(h instanceof Response)throw h;return m.error(`500 attachment=? viewer=? reason=unexpected message=${h instanceof Error?h.message:"unknown"}`),T(500,"Attachment request failed")}}}}}import{aliasedTable as Ue,and as G,asc as nt,desc as He,eq as f,getColumns as Jr,inArray as Re,isNull as ce,or as Oe,sql as Ft}from"drizzle-orm";var Ee=t=>Jr(t),de=(t,e)=>{if(!t)return null;let r=t instanceof Date?t:new Date(t);if(Number.isNaN(r.getTime()))return typeof t=="string"?t:null;let s=r.getFullYear(),d=s<0?`-${String(-s).padStart(4,"0")}`:String(s).padStart(4,"0"),l=String(r.getMonth()+1).padStart(2,"0"),D=String(r.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${d}-${l}-${D}`;let p=String(r.getHours()).padStart(2,"0"),x=String(r.getMinutes()).padStart(2,"0"),i=String(r.getSeconds()).padStart(2,"0");return`${d}-${l}-${D} ${p}:${x}:${i}`};function qt(t){let{db:e,tables:r,userTable:s,resolveUserId:d,encodeUserId:l,redis:D,cache:p,epochs:x}=t,{hub:i,internal:U,comment:m,label:V,hubLabel:K,userStatus:H}=r,fe=t.externalSources??[],Ye=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Fe=Ye[0]??"\u4E0B\u66F8\u304D",ne=t.logger??ye(1,"[DailyReportService]"),Ne="daily-report:ids",Rt=t.idsTtlMs??18e4,xe="daily-report:ids:epoch",S="daily-report:business-date:",q=t.businessDateTtlMs??3e5,A="daily-report:date-epoch:",T="daily-report:detail-epoch:",N=`${t.streamKey??"daily-report:sse-stream"}:v2`,O=t.streamMaxLen??1e4,g=n=>x.incrementEpoch(n),L=n=>Pt(i.sourceType,n),k=(n,a)=>`${Ne}:user:${n}:st:${a}`,Y=n=>`${Ne}:user:${n}:`,he=(n,a,o)=>`daily-report:date:${n}:user:${a}:st:${o}`,E=(n,a)=>`daily-report:date:${n}:user:${a}:`,$=(n,a,o)=>`daily-report:detail:${n}:user:${a}:st:${o}`,M=(n,a)=>`daily-report:detail:${n}:user:${a}:`,_=async(n,a)=>{let o=await D?.getClient();if(!o){ne.warn(`[SSE] Redis client unavailable (${a})`);return}let u=Date.now();try{await o.xAdd(N,"*",{data:JSON.stringify(n)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:O}});let y=Date.now()-u;y>1e3&&ne.warn(`[SSE] Slow publish (${a}): ${y}ms`)}catch(y){ne.error(`[SSE] Redis publish failed (${a}):`,y)}},F=n=>n==null||n===""?null:/^\d+$/.test(n)?l(Number(n)):n,w=()=>{let n={};for(let a of fe)n[`ext_${a.sourceType}`]=Ee(a.table);return n},B=n=>{let a=n;for(let o of fe)a=a.leftJoin(o.table,G(f(i.sourceType,o.sourceType),f(i.sourceIdNum,o.idColumn)));return a},ee=(n,a,o)=>{let{hub:u,internal:y}=a,b=u.summary,R=[],I=null,C=null,Q=null,j=null,Z=null,oe=null,Le=[],_e=fe.find(P=>P.sourceType===u.sourceType),Pe=_e?a[`ext_${_e.sourceType}`]:void 0;if(_e&&Pe){let P=_e.mapRow(Pe);P.content!==void 0&&(b=P.content),P.employeeName!==void 0&&(oe=P.employeeName),P.category!==void 0&&(I=P.category),P.creationCategory!==void 0&&(C=P.creationCategory),P.visitTimeFrom!==void 0&&(Q=P.visitTimeFrom),P.visitTimeTo!==void 0&&(j=P.visitTimeTo),P.customerName!==void 0&&(Z=P.customerName),P.interviewers!==void 0&&(R=P.interviewers),P.externalComments!==void 0&&(Le=P.externalComments)}else u.sourceType==="Internal"&&y&&(b=y.body);let Ae=(a.labels??[]).map(P=>({id:P.id,name:P.name,color:P.color})),ie=a.postedCommentRows??[],X=we(n.commentable,u.sourceType),le=C?Ye.includes(C):!1,ot=Te?.[0]??null;return le&&ot&&!Ae.some(P=>P.id===ot)&&Ae.push({id:ot,name:Fe,color:null}),{reportHubId:u.id,date:de(u.businessDate,"YYYY-MM-DD"),author:a.creatorName??F(u.createdBy)??"",userId:u.userId?l(u.userId):"",sourceType:u.sourceType??"Internal",createdAt:de(u.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:de(u.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:F(u.updatedBy),employeeName:oe??a.creatorName??F(u.createdBy),category:I,creationCategory:C,visitTimeFrom:Q,visitTimeTo:j,customerName:Z,interviewers:R,subject:u.title,content:b,externalComments:X?Le:[],isRead:a.isRead??!1,isStarred:a.isStarred??!1,labels:Ae,postedComments:ie.filter(P=>X||o!==void 0&&P.userId===o).map(P=>({...P,userId:l(P.userId),isMine:o?P.userId===o:!1})),attachments:a.attachments}},Se=async(n,a)=>{let o=Ue(K,"draft_label"),u=await Ce();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).from(i).leftJoin(o,G(f(o.hubId,i.id),Re(o.labelId,u))).where(G(ce(i.deletedAt),Oe(f(i.userId,a),ce(i.userId),ce(o.hubId)),L(n.visible))).orderBy(He(i.businessDate),He(i.id))).map(b=>({...b,businessDate:de(b.businessDate,"YYYY-MM-DD")}))},pe=async(n,a,o)=>{let u=await v(a);if(!u)return[];if(ke(n.visible))return[];let y=Ue(K,"draft_label"),b=await Ce();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).top(o).from(i).leftJoin(y,G(f(y.hubId,i.id),Re(y.labelId,b))).where(G(ce(i.deletedAt),Oe(f(i.userId,u),ce(i.userId),ce(y.hubId)),L(n.visible))).orderBy(He(i.businessDate),He(i.id))).map(I=>({...I,businessDate:de(I.businessDate,"YYYY-MM-DD")}))},se=async(n,a)=>{let o=await B(e.select({hub:Ee(i),internal:Ee(U),creatorName:s.displayName,...w()}).from(i)).leftJoin(U,f(i.id,U.hubId)).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,Ft`${a}`),ce(i.deletedAt),L(n.visible))).orderBy(He(i.id)),u=await Ge(o.map(y=>y.hub.id));return o.map(y=>ee(n,{...y,attachments:u.get(y.hub.id)??[]}))},te=n=>`${S}${n}`,J=new Map,v=async n=>{if(!t.disableUserIdCache&&J.has(n))return J.get(n)??null;let a=await d(n);return a!==null&&!t.disableUserIdCache&&J.set(n,a),a},W=async(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:y,onFetchStart:b}={})=>{let R=await v(a);if(!R)return[];if(ke(n.visible))return[];let I=k(R,Je(n));return p.getOrFetch({cacheKey:I,fetcher:async()=>{let C=await Se(n,R);return vt(C)?C:(ne.warn("[DailyReportService] ids array is not in stream order; re-sorting (check SQL ORDER BY vs compareIdsStreamOrder, or concurrent row movement during the scan)"),[...C].sort(We))},onFetchStart:b,forceRefresh:o,snapshot:u,ttlMsOverride:y??Rt,epochKey:xe,refreshAheadRatio:.5})},me=(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:y}={})=>{let b=ue(a);return b?ke(n.visible)?Promise.resolve([]):p.getOrFetch({cacheKey:`${te(b)}:st:${Je(n)}`,fetcher:()=>se(n,b),forceRefresh:o,snapshot:u,ttlMsOverride:y??q}):Promise.resolve([])},Te=null,Ie=async()=>(Te!==null||(Te=(await e.select({id:V.id}).from(V).where(Re(V.name,Ye)).orderBy(V.id)).map(a=>a.id)),Te),Ce=async()=>{let n=await Ie();return n.length>0?n:[-1]},qe=async()=>{let n=await Ie();if(n.length===0)return null;let[a]=await e.select({id:V.id}).top(1).from(V).where(f(V.name,Fe));return a?.id??n[0]},jt=(n,a)=>a!=null?"absent":n!=null?"present":"unknown",Ge=async n=>{let a=new Map,o=r.attachment,u=t.attachmentIdCodec;if(n.length===0||!o||!u)return a;let y=await e.select({id:o.id,hubId:o.hubId,fileName:o.fileName,fileType:o.fileType,fileSize:o.fileSize,createdAt:o.createdAt,objectCheckedAt:o.objectCheckedAt,objectMissingAt:o.objectMissingAt}).from(o).where(Re(o.hubId,n)).orderBy(nt(o.createdAt),nt(o.id));for(let b of y){let R={id:u.encode(Number(b.id)),fileName:String(b.fileName),fileType:b.fileType?String(b.fileType):null,fileSize:b.fileSize!=null?Number(b.fileSize):null,createdAt:de(b.createdAt,"YYYY-MM-DD HH:mm:ss"),state:jt(b.objectCheckedAt,b.objectMissingAt)},I=a.get(Number(b.hubId));I?I.push(R):a.set(Number(b.hubId),[R])}return a},Jt=async(n,a,o)=>{let u=r.attachment;if(!u||ke(n.visible))return null;let y=await Ce(),b=Ue(K,"draft_label");return(await e.select({fileName:u.fileName,filePath:u.filePath,fileType:u.fileType,fileSize:u.fileSize}).top(1).from(u).innerJoin(i,f(i.id,u.hubId)).leftJoin(b,G(f(b.hubId,i.id),Re(b.labelId,y))).where(G(f(u.id,a),ce(i.deletedAt),Oe(f(i.userId,o),ce(b.hubId)),L(n.visible))))[0]??null},Gt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentMissing failed",u)}},Qt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentPresent failed",u)}},Xt=async(n,a,o,{forceRefresh:u=!1,snapshot:y=!1,ttlMsOverride:b}={})=>{let R=await v(o);if(!R)return[];let I=ue(a);if(!I)return[];if(ke(n.visible))return[];let C=he(I,R,Je(n));return p.getOrFetch({cacheKey:C,fetcher:async()=>{let Q=await Ce(),j=Ue(K,"draft_label"),Z=await B(e.select({hub:Ee(i),internal:Ee(U),isRead:H.isRead,isStarred:H.isStarred,creatorName:s.displayName,...w()}).from(i)).leftJoin(U,f(i.id,U.hubId)).leftJoin(H,G(f(i.id,H.hubId),f(H.userId,R))).leftJoin(j,G(f(j.hubId,i.id),Re(j.labelId,Q))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,Ft`${I}`),ce(i.deletedAt),Oe(f(i.userId,R),ce(j.hubId)),L(n.visible))).orderBy(He(i.id));if(Z.length===0)return[];let oe=Z.map(X=>X.hub.id),Le=await e.select({hubId:K.hubId,id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(Re(K.hubId,oe)),_e=await e.select({hubId:m.hubId,id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(Re(m.hubId,oe)).orderBy(nt(m.createdAt)),Pe=await Ge(oe),Ae=new Map,ie=new Map;for(let X of Le){let le=Ae.get(X.hubId);le||(le=[],Ae.set(X.hubId,le)),le.push({id:X.id,name:X.name,color:X.color})}for(let X of _e){let le=ie.get(X.hubId);le||(le=[],ie.set(X.hubId,le)),le.push({id:X.id,content:X.body,createdAt:de(X.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:X.userId,userName:X.userName||""})}return Z.map(X=>{let le=X.hub.id;return ee(n,{...X,attachments:Pe.get(le)??[],labels:Ae.get(le)||[],postedCommentRows:ie.get(le)||[]},R)})},forceRefresh:u,snapshot:y,ttlMsOverride:b??q,epochKey:`${A}${I}`})},ze=async(n,a,o,{forceRefresh:u=!1,snapshot:y=!1,ttlMsOverride:b}={})=>{if(ke(n.visible))return null;let R=$(a,o,Je(n));return(await p.getOrFetch({cacheKey:R,fetcher:async()=>{let C=await Ce(),Q=Ue(K,"draft_label"),j=await B(e.select({hub:Ee(i),internal:Ee(U),isRead:H.isRead,isStarred:H.isStarred,creatorName:s.displayName,...w()}).from(i)).leftJoin(U,f(i.id,U.hubId)).leftJoin(H,G(f(i.id,H.hubId),f(H.userId,o))).leftJoin(Q,G(f(Q.hubId,i.id),Re(Q.labelId,C))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.id,a),ce(i.deletedAt),Oe(f(i.userId,o),ce(Q.hubId)),L(n.visible)));if(j.length===0)return[];let Z=j[0].hub.id,oe=await e.select({id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(f(K.hubId,Z)),Le=await e.select({id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(f(m.hubId,Z)).orderBy(nt(m.createdAt)),_e=await Ge([Z]),Pe=oe.map(ie=>({id:ie.id,name:ie.name,color:ie.color})),Ae=Le.map(ie=>({id:ie.id,content:ie.body,createdAt:de(ie.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:ie.userId,userName:ie.userName||""}));return[ee(n,{...j[0],attachments:_e.get(Z)??[],labels:Pe,postedCommentRows:Ae},o)]},forceRefresh:u,snapshot:y,ttlMsOverride:b??q,epochKey:`${T}${a}`}))[0]??null},Wt=async(n,a,o,u={})=>{let y=await v(o);return y?ze(n,a,y,u):null},Zt=async(n,a)=>{let o=await Ce(),u=Ue(K,"draft_label"),[y]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt}).top(1).from(i).leftJoin(u,G(f(u.hubId,i.id),Re(u.labelId,o))).where(G(f(i.id,n),Oe(f(i.userId,a),ce(u.hubId))));return y??null},at=async(n,a,o)=>{let u=await Zt(a,o);if(!u||u.deletedAt||!we(n.visible,u.sourceType))throw new Error("Not Found")},er=async(n,a,o,u,y,b)=>{await at(n,o,a);let R=await e.select().top(1).from(H).where(G(f(H.hubId,o),f(H.userId,a))),I;if(R.length>0?R[0].isStarred!==y?I=(await e.update(H).set({isStarred:y,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(H.hubId,o),f(H.userId,a))))[0]:I=R[0]:I=(await e.insert(H).output().values({hubId:o,userId:a,isStarred:y,isRead:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(E(C,a)),await g(`${A}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(M(o,a)),await g(`${T}${o}`),await _(Ze.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"star",value:y,clientTempId:b}),"setStarStatus"),I},tr=async(n,a,o,u,y,b)=>{await at(n,o,a);let R=await e.select().top(1).from(H).where(G(f(H.hubId,o),f(H.userId,a))),I;if(R.length>0?R[0].isRead!==y?I=(await e.update(H).set({isRead:y,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(H.hubId,o),f(H.userId,a))))[0]:I=R[0]:I=(await e.insert(H).output().values({hubId:o,userId:a,isRead:y,isStarred:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(E(C,a)),await g(`${A}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(M(o,a)),await g(`${T}${o}`),await _(Ze.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"read",value:y,clientTempId:b}),"setReadStatus"),I},Dt=async(n,a)=>{if(a===null)return;let o=await Ce(),[u]=await e.select({hubId:K.hubId}).top(1).from(K).where(G(f(K.hubId,n),Re(K.labelId,o)));return u?a:void 0},rr=async(n,a,o,u,y,b)=>{let[R]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt,userId:i.userId}).top(1).from(i).where(f(i.id,o));if(!R||R.deletedAt)throw new Error("Not Found");if(await at(n,o,a),!we(n.commentable,R.sourceType))throw new Error("Comments are restricted by the viewer's comment permission");if(R.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let I=await Dt(o,R.userId),[C]=await e.insert(m).output().values({hubId:o,userId:a,body:u,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}),[Q]=await e.select({displayName:s.displayName}).top(1).from(s).where(f(s.id,a)),j=Q?.displayName??"Unknown";if(y){let oe=ue(y);oe&&(p.invalidatePrefix(`daily-report:date:${oe}:user:`),await g(`${A}${oe}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await g(`${T}${o}`);let Z={id:C.id,userId:l(C.userId),userName:j,content:C.body,createdAt:de(C.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await _(pt.parse({type:"comment-add",reportHubId:o,comment:Z,clientTempId:b,recipientRawUserId:I,sourceType:R.sourceType}),"addComment"),Z},nr=async(n,a)=>await n.select().top(1).from(m).where(f(m.id,a)),ar=async(n,a,o,u,y,b)=>{let R=await nr(e,u);if(R.length===0)throw new Error("Not Found");if(R[0].hubId!==o)throw new Error("Not Found");let[I]=await e.select({userId:i.userId,sourceType:i.sourceType}).top(1).from(i).where(f(i.id,R[0].hubId));if(!(I&&we(n.visible,I.sourceType)))throw new Error("Not Found");if(R[0].userId!==a)throw new Error("Unauthorized");let C=await Dt(o,I.userId);if(await e.delete(m).where(f(m.id,u)),y){let Q=ue(y);Q&&(p.invalidatePrefix(`daily-report:date:${Q}:user:`),await g(`${A}${Q}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await g(`${T}${o}`),await _(mt.parse({type:"comment-delete",reportHubId:o,commentId:u,clientTempId:b,recipientRawUserId:C,sourceType:I?.sourceType}),"deleteComment")},sr=async(n,a,o)=>{ne.info("createDailyReport called",{userId:n,businessDate:a});let[u]=await e.select({displayName:s.displayName}).from(s).where(f(s.id,n)),y=u?.displayName??l(n);try{let b=await e.transaction(async C=>{ne.info("Starting transaction");let Q=`internal-temp-${Date.now()}-${Math.random()}`,[j]=await C.insert(i).output().values({sourceType:"Internal",sourceId:Q,businessDate:new Date(a),userId:n,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)});await C.update(i).set({sourceId:String(j.id)}).where(f(i.id,j.id)),ne.info("Hub created",j),await C.insert(U).values({hubId:j.id,body:"",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)}),ne.info("Internal created"),ne.info("Calling getDraftLabelId");let Z=await qe();ne.info("draftLabelId",Z);let oe=[];return Z&&(await C.insert(K).values({hubId:j.id,labelId:Z,createdAt:new Date,createdBy:String(n)}),oe.push({id:Z,name:Fe,color:null})),ne.info("Label assigned"),{reportHubId:j.id,date:a,createdAt:de(j.createdAt,"YYYY-MM-DD HH:mm:ss"),author:y,userId:l(n),sourceType:"Internal",employeeName:y,updatedBy:l(n),updatedAt:de(j.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:j.title,content:"",externalComments:[],isRead:!0,isStarred:!1,labels:oe,postedComments:[],attachments:[]}}),R=ue(a);R&&p.invalidatePrefix(E(R,n)),p.invalidatePrefix(S),p.invalidatePrefix(Y(n)),await g(xe),R&&await g(`${A}${R}`);let I=await ze(ge.unrestricted("post-write self read: the writer always sees the row they just wrote"),b.reportHubId,n,{forceRefresh:!0});if(I){let C=await Ie(),Q=I.labels.some(j=>C.includes(j.id));await _(yt.parse({type:"report-create",reportHubId:I.reportHubId,report:I,clientTempId:o,recipientRawUserId:Q?n:void 0}),"createDailyReport")}return I??b}catch(b){throw ne.error("Error in createDailyReport",b),b}},Qe=async(n,a)=>await n.select().top(1).from(i).where(f(i.id,a)),st=async(n,a,o)=>{await n.update(i).set(o).where(f(i.id,a))},wt=async(n,a,o)=>{await n.update(U).set(o).where(f(U.hubId,a))},St=async(n,a,o)=>{await n.delete(K).where(G(f(K.hubId,a),f(K.labelId,o)))};return{streamKey:N,streamMaxLen:O,clearCache:async()=>{p.clearAll(),J.clear(),Te=null,x&&await g(xe),ne.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(n,a)=>{p.invalidatePrefix(S),p.invalidatePrefix(Ne),await g(xe);for(let o of new Set(n))p.invalidatePrefix(`daily-report:detail:${o}:user:`),await g(`${T}${o}`);for(let o of new Set(a)){let u=ue(o);u&&await g(`${A}${u}`)}},getUserIdByExternalId:v,getDailyReportIdsByExternalId:W,getDailyReportIdsFirstPageByExternalId:pe,getDailyReportsByBusinessDate:me,getDailyReportsByBusinessDateByExternalId:Xt,getDailyReportDetailById:ze,getDailyReportDetailByIdByExternalId:Wt,getDraftLabelId:qe,getAttachmentsByHubIds:Ge,getAttachmentForUser:Jt,markAttachmentMissing:Gt,markAttachmentPresent:Qt,setStarStatus:er,setReadStatus:tr,addComment:rr,deleteComment:ar,createDailyReport:sr,updateDailyReport:async(n,a,o,u)=>{let y=await Qe(e,n);if(!y.length||y[0].deletedAt)throw new Error("Not Found");if(y[0].userId!==a)throw new Error("Unauthorized");await e.transaction(async I=>{o.title!==void 0&&await st(I,n,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await wt(I,n,{body:o.content,updatedAt:new Date,updatedBy:String(a)})}),p.invalidate(`daily-report:detail:${n}`),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(S),await g(`${T}${n}`);let b=ue(de(y[0].businessDate,"YYYY-MM-DD"));b&&(p.invalidatePrefix(`daily-report:date:${b}:user:`),await g(`${A}${b}`));let R=await ze(ge.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});if(R){let I=await Ie(),C=R.labels.some(Q=>I.includes(Q.id));await _(ht.parse({type:"report-update",reportHubId:R.reportHubId,report:R,clientTempId:u,recipientRawUserId:C?a:void 0}),"updateDailyReport")}},publishDailyReport:async(n,a,o)=>{let u=await Qe(e,n);if(!u.length)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");let y=await qe();if(!y)return null;if(await St(e,n,y),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(S),p.invalidatePrefix(Ne),await g(xe),u[0].businessDate){let I=ue(de(u[0].businessDate,"YYYY-MM-DD"));I&&await g(`${A}${I}`)}let b=ue(de(u[0].businessDate,"YYYY-MM-DD"));b&&p.invalidatePrefix(E(b,a));let R=await ze(ge.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});return R&&await _(ft.parse({type:"report-publish",reportHubId:R.reportHubId,report:R,clientTempId:o}),"publishDailyReport"),R??null},deleteDailyReport:async(n,a,o)=>{let u=await Qe(e,n);if(!u.length||u[0].deletedAt)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");if(await st(e,n,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(S),p.invalidatePrefix(Ne),await g(xe),u[0].businessDate){let y=ue(de(u[0].businessDate,"YYYY-MM-DD"));y&&await g(`${A}${y}`)}await _(bt.parse({type:"report-delete",reportHubId:n,clientTempId:o,sourceType:u[0].sourceType}),"deleteDailyReport")},findDailyReportHubById:Qe,updateDailyReportHub:st,updateDailyReportInternal:wt,deleteDailyReportLabel:St}}import{and as Gr,eq as zt}from"drizzle-orm";function Qr(t){let e=[],r=t&&t.length>0?t:[{key:"internal",name:"Internal",description:"Internal daily reports"},{key:"external",name:"External",description:"External daily reports"}];for(let s of r){let l=`daily_report_${s.key.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`;e.push({resourceKey:l,name:s.name,description:s.description??`${s.name} daily report access`}),s.includeCommentResource!==!1&&e.push({resourceKey:`${l}_comment`,name:`${s.name} Comment`,description:`${s.name} daily report comment access`})}return e}async function qn(t,e,r){let s=t,d=e.TMResource,l=r.appKey,D=r.actor??"system:daily-report",p=new Date,x=r.resources??Qr(r.sources);for(let i of x){let U=await s.select().from(d).where(Gr(zt(d.appKey,l),zt(d.resourceKey,i.resourceKey)));(!U||U.length===0)&&await s.insert(d).values({appKey:l,resourceKey:i.resourceKey,name:i.name,description:i.description??null,createdAt:p,createdBy:D,updatedAt:p,updatedBy:D})}}var Xr=ye(1,"[DailyReportExternalSource]"),Kn=(t,e,r,s=Xr)=>{if(!t)return[];try{let d=JSON.parse(t);return Array.isArray(d)?d.map(r).filter(l=>l!==null):(s.warn(`Unexpected ${e} format: not an array`),[])}catch(d){return s.warn(`Failed to parse ${e}:`,d),[]}};import{desc as Vt,sql as Wr}from"drizzle-orm";import{bigint as re,bit as Kt,date as Zr,datetime2 as ae,foreignKey as De,index as ve,int as en,mssqlSchema as tn,nvarchar as z,primaryKey as Me,uniqueIndex as rn}from"drizzle-orm/mssql-core";function Qn(t,e){let r=tn(t),s=e.userTable,d=r.table("DailyReportHub",{id:re("id",{mode:"number"}).identity().notNull(),sourceType:z("source_type",{length:20}).notNull(),sourceId:z("source_id",{length:100}).notNull(),sourceIdNum:re("source_id_num",{mode:"number"}).generatedAlwaysAs(Wr`TRY_CAST(source_id AS BIGINT)`),businessDate:Zr("business_date"),userId:re("user_id",{mode:"number"}),title:z("title",{length:200}),summary:z("summary",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull(),deletedAt:ae("deleted_at"),deletedBy:z("deleted_by",{length:50})},m=>[Me({name:`${t}_DailyReportHub_pk`,columns:[m.id]}),De({name:`${t}_DailyReportHub_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),ve(`${t}_DailyReportHub_business_date_index`).on(m.businessDate),ve(`${t}_DailyReportHub_updated_at_index`).on(m.updatedAt),ve(`${t}_DailyReportHub_source_index`).on(m.sourceType,m.sourceId),ve(`${t}_DailyReportHub_user_id_index`).on(m.userId),ve(`${t}_DailyReportHub_business_date_id_index`).on(Vt(m.businessDate),Vt(m.id)),ve(`${t}_DailyReportHub_deleted_at_index`).on(m.deletedAt)]),l=r.table("DailyReportInternal",{hubId:re("hub_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}),metadata:z("metadata",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportInternal_pk`,columns:[m.hubId]}),De({name:`${t}_DailyReportInternal_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]})]),D=r.table("DailyReportComment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportComment_pk`,columns:[m.id]}),De({name:`${t}_DailyReportComment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),De({name:`${t}_DailyReportComment_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),ve(`${t}_DailyReportComment_hub_id_index`).on(m.hubId)]),p=r.table("DailyReportLabel",{id:re("id",{mode:"number"}).identity().notNull(),userId:re("user_id",{mode:"number"}),name:z("name",{length:50}).notNull(),color:z("color",{length:20}),sortOrder:en("sort_order"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportLabel_pk`,columns:[m.id]}),De({name:`${t}_DailyReportLabel_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),x=r.table("DailyReportHub_Label",{hubId:re("hub_id",{mode:"number"}).notNull(),labelId:re("label_id",{mode:"number"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportHub_Label_pk`,columns:[m.hubId,m.labelId]}),De({name:`${t}_DailyReportHub_Label_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),De({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[m.labelId],foreignColumns:[p.id]})]),i=r.table("DailyReportUserStatus",{hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),isRead:Kt("is_read").default(!1).notNull(),isStarred:Kt("is_starred").default(!1).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportUserStatus_pk`,columns:[m.hubId,m.userId]}),De({name:`${t}_DailyReportUserStatus_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),De({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),U=r.table("DailyReportAttachment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),uploadedBy:re("uploaded_by",{mode:"number"}),sourceKey:z("source_key",{length:200}).notNull(),fileName:z("file_name",{length:255}).notNull(),filePath:z("file_path",{length:"max"}).notNull(),fileType:z("file_type",{length:100}),fileSize:re("file_size",{mode:"number"}),objectCheckedAt:ae("object_checked_at"),objectMissingAt:ae("object_missing_at"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[Me({name:`${t}_DailyReportAttachment_pk`,columns:[m.id]}),De({name:`${t}_DailyReportAttachment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),De({name:`${t}_DailyReportAttachment_uploaded_by_fk`,columns:[m.uploadedBy],foreignColumns:[s.id]}),rn(`${t}_DailyReportAttachment_source_unique`).on(m.hubId,m.sourceKey),ve(`${t}_DailyReportAttachment_hub_id_index`).on(m.hubId,m.createdAt)]);return{hub:d,internal:l,comment:D,attachment:U,label:p,hubLabel:x,userStatus:i}}function ra(t){t.redis||(t.logger??console).warn("[DailyReport] redis provider is not injected: cross-worker cache invalidation is disabled (staleness is bounded only by TTL) and SSE publishing is skipped.");let e=Tt(t.redis),r=new Xe({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),s=qt({...t,cache:r,epochs:e}),d=new tt({redis:t.redis,streamKey:s.streamKey,cache:r,logger:t.logger}),l=Yt({authenticate:t.authenticate,resolveVisibleSourceTypes:t.resolveVisibleSourceTypes,service:s,encodeUserId:t.encodeUserId,attachmentIdCodec:t.attachmentIdCodec,readAttachment:t.readAttachment,attachmentMaxBytes:t.attachmentMaxBytes,attachmentRateLimitPerMinute:t.attachmentRateLimitPerMinute,attachmentConcurrency:t.attachmentConcurrency,redis:t.redis,sseReader:d,streamKey:s.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:s,cache:r,epochs:e,sseReader:d,streamKey:s.streamKey,knownSourceTypes:[...new Set(["Internal",...(t.externalSources??[]).map(D=>D.sourceType)])],...l}}export{tt as DailyReportSseReader,ge as DailyReportViewerScope,Xe as SqlResultCache,Hr as asciiFallbackFileName,Pt as buildVisibleSourceTypeCondition,Lt as computeSourceTypeDigest,Je as computeViewerScopeDigest,Yt as createDailyReportHandlers,ra as createDailyReportServer,qt as createDailyReportService,Tt as createEpochStore,Qr as defineDailyReportAuthzResources,Qn as defineDailyReportSchema,ke as deniesEverySourceType,Ur as encodeRfc8187,de as formatDateValue,gt as generateETag,we as isSourceTypeVisible,Ke as isStreamIdLte,be as jsonResponseWithETag,Nt as normalizeVisibleSourceTypes,Ht as sanitizeMediaType,qn as seedDailyReportAuthzResources,Kn as transformJsonArray};
|
|
14
|
+
`,J=te!=="0-0"?`id: ${te}
|
|
15
|
+
${v}`:v;E.enqueue(M.encode(J))}if(L)try{let v=await d?.getClient();if(v){let J=await v.xRange(R,L,"+",{COUNT:1e3});for(let me of J)me.id!==L&&(Q!==null&&ze(Q,me.id)||(ze(me.id,te)||(te=me.id),be(me.id,me.message)))}}catch(v){O.error(`[SSE:${$}] catch-up xRange error:`,v)}},cancel(){H()}});return new Response(pe,{headers:y({"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"})})}},attachment:{loader:async({request:w,params:U})=>{let k=null,T=(y,$,F)=>{let _=new Headers({"Content-Type":"application/json"});return F!==void 0&&_.set("Retry-After",String(F)),k&&_.append("Set-Cookie",k),new Response(JSON.stringify({error:{message:$}}),{status:y,headers:_})};try{let{user:y,cookie:$}=await e(w,{failureRedirect:null});if(k=$??null,!y)return T(401,"Unauthorized");if(w.method!=="GET"&&w.method!=="HEAD")return T(405,"Method not allowed");let F=t.attachmentIdCodec,_=t.readAttachment;if(!(F&&_))return T(404,"Attachment not found");let S=U.token??"",A=F.decode(S);if(A===null||!Number.isSafeInteger(A)||A<=0)return T(400,"Invalid attachment token");let q=await r.getUserIdByExternalId(y.id);if(!q)return T(403,"Forbidden");if(!K(q,Date.now()))return m.error(`429 attachment=${A} viewer=${q} reason=rate_limit`),T(429,"Too many requests",Lr);let he=await fe(w),L=await r.getAttachmentForUser(he,A,q);if(!L)return m.error(`404 attachment=${A} viewer=${q} reason=not_visible`),T(404,"Attachment not found");if(L.fileSize!=null&&L.fileSize>V)return m.error(`413 attachment=${A} viewer=${q} reason=db_size`),T(413,"Attachment too large");if(!Y.tryAcquire())return m.error(`503 attachment=${A} viewer=${q} reason=concurrency`),T(503,"Too many concurrent downloads",Pr);let M=!1,E=()=>{M||(M=!0,Y.release())},P=!1;try{let N=w.method==="HEAD",D=await _(L.filePath,{maxBytes:V,head:N,principal:s(q)});if(!D.ok){let v=Yr(D.reason);return D.reason==="not_found"&&r.markAttachmentMissing(A).catch(J=>{m.error(`markAttachmentMissing failed attachment=${A} message=${J instanceof Error?J.message:"unknown"}`)}),m.error(`${v} attachment=${A} viewer=${q} reason=${D.reason} code=${D.code??"-"}`),T(v,Fr[v]??"Attachment storage unavailable")}let H=Ot(L.fileType)??Ot(D.contentType)??"application/octet-stream",ee=$r.has(H),be=new URL(w.url).searchParams.get("download")==="1",pe=ee?H:"application/octet-stream",se=ee&&!be?"inline":"attachment",te=D.size??D.bytes.byteLength,Q=new Headers({"Content-Type":pe,"Content-Length":String(te),"Content-Disposition":`${se}; filename="${Or(L.fileName)}"; filename*=UTF-8''${Hr(L.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return k&&Q.append("Set-Cookie",k),r.markAttachmentPresent(A).catch(v=>{m.error(`markAttachmentPresent failed attachment=${A} message=${v instanceof Error?v.message:"unknown"}`)}),m.info(`200 attachment=${A} viewer=${q} type=${pe} disposition=${se} bytes=${te}`),N?new Response(null,{status:200,headers:Q}):(P=!0,new Response(Vr(D.bytes,E,Mr),{status:200,headers:Q}))}finally{P||E()}}catch(y){if(y instanceof Response)throw y;return m.error(`500 attachment=? viewer=? reason=unexpected message=${y instanceof Error?y.message:"unknown"}`),T(500,"Attachment request failed")}}}}}import{runWithTransactionRetry as Gr}from"@aiquants/mssql";import{aliasedTable as $e,and as G,asc as tt,desc as Be,eq as f,getColumns as Qr,inArray as we,isNull as ce,or as Ue,sql as qt}from"drizzle-orm";var xe=t=>Qr(t),de=(t,e)=>{if(!t)return null;let r=t instanceof Date?t:new Date(t);if(Number.isNaN(r.getTime()))return typeof t=="string"?t:null;let s=r.getFullYear(),d=s<0?`-${String(-s).padStart(4,"0")}`:String(s).padStart(4,"0"),l=String(r.getMonth()+1).padStart(2,"0"),R=String(r.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${d}-${l}-${R}`;let p=String(r.getHours()).padStart(2,"0"),x=String(r.getMinutes()).padStart(2,"0"),i=String(r.getSeconds()).padStart(2,"0");return`${d}-${l}-${R} ${p}:${x}:${i}`};function zt(t){let{db:e,tables:r,userTable:s,resolveUserId:d,encodeUserId:l,redis:R,cache:p,epochs:x}=t,{hub:i,internal:O,comment:m,label:V,hubLabel:K,userStatus:Y}=r,fe=t.externalSources??[],He=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Oe=He[0]??"\u4E0B\u66F8\u304D",ne=t.logger??ye(1,"[DailyReportService]"),rt=n=>Gr(a=>e.transaction(o=>a(()=>n(o))),t.transactionRetry),Ee="daily-report:ids",Dt=t.idsTtlMs??18e4,w="daily-report:ids:epoch",U="daily-report:business-date:",k=t.businessDateTtlMs??3e5,T="daily-report:date-epoch:",y="daily-report:detail-epoch:",F=`${t.streamKey??"daily-report:sse-stream"}:v2`,_=t.streamMaxLen??1e4,S=n=>x.incrementEpoch(n),A=n=>$t(i.sourceType,n),q=(n,a)=>`${Ee}:user:${n}:st:${a}`,he=n=>`${Ee}:user:${n}:`,L=(n,a,o)=>`daily-report:date:${n}:user:${a}:st:${o}`,M=(n,a)=>`daily-report:date:${n}:user:${a}:`,E=(n,a,o)=>`daily-report:detail:${n}:user:${a}:st:${o}`,P=(n,a)=>`daily-report:detail:${n}:user:${a}:`,N=async(n,a)=>{let o=await R?.getClient();if(!o){ne.warn(`[SSE] Redis client unavailable (${a})`);return}let u=Date.now();try{await o.xAdd(F,"*",{data:JSON.stringify(n)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:_}});let h=Date.now()-u;h>1e3&&ne.warn(`[SSE] Slow publish (${a}): ${h}ms`)}catch(h){ne.error(`[SSE] Redis publish failed (${a}):`,h)}},D=n=>n==null||n===""?null:/^\d+$/.test(n)?l(Number(n)):n,H=()=>{let n={};for(let a of fe)n[`ext_${a.sourceType}`]=xe(a.table);return n},ee=n=>{let a=n;for(let o of fe)a=a.leftJoin(o.table,G(f(i.sourceType,o.sourceType),f(i.sourceIdNum,o.idColumn)));return a},be=(n,a,o)=>{let{hub:u,internal:h}=a,b=u.summary,g=[],I=null,C=null,X=null,j=null,Z=null,oe=null,Me=[],Ce=fe.find(B=>B.sourceType===u.sourceType),Ne=Ce?a[`ext_${Ce.sourceType}`]:void 0;if(Ce&&Ne){let B=Ce.mapRow(Ne);B.content!==void 0&&(b=B.content),B.employeeName!==void 0&&(oe=B.employeeName),B.category!==void 0&&(I=B.category),B.creationCategory!==void 0&&(C=B.creationCategory),B.visitTimeFrom!==void 0&&(X=B.visitTimeFrom),B.visitTimeTo!==void 0&&(j=B.visitTimeTo),B.customerName!==void 0&&(Z=B.customerName),B.interviewers!==void 0&&(g=B.interviewers),B.externalComments!==void 0&&(Me=B.externalComments)}else u.sourceType==="Internal"&&h&&(b=h.body);let Ae=(a.labels??[]).map(B=>({id:B.id,name:B.name,color:B.color})),ie=a.postedCommentRows??[],W=Ie(n.commentable,u.sourceType),le=C?He.includes(C):!1,it=ge?.[0]??null;return le&&it&&!Ae.some(B=>B.id===it)&&Ae.push({id:it,name:Oe,color:null}),{reportHubId:u.id,date:de(u.businessDate,"YYYY-MM-DD"),author:a.creatorName??D(u.createdBy)??"",userId:u.userId?l(u.userId):"",sourceType:u.sourceType??"Internal",createdAt:de(u.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:de(u.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:D(u.updatedBy),employeeName:oe??a.creatorName??D(u.createdBy),category:I,creationCategory:C,visitTimeFrom:X,visitTimeTo:j,customerName:Z,interviewers:g,subject:u.title,content:b,externalComments:W?Me:[],isRead:a.isRead??!1,isStarred:a.isStarred??!1,labels:Ae,postedComments:ie.filter(B=>W||o!==void 0&&B.userId===o).map(B=>({...B,userId:l(B.userId),isMine:o?B.userId===o:!1})),attachments:a.attachments}},pe=async(n,a)=>{let o=$e(K,"draft_label"),u=await Te();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).from(i).leftJoin(o,G(f(o.hubId,i.id),we(o.labelId,u))).where(G(ce(i.deletedAt),Ue(f(i.userId,a),ce(i.userId),ce(o.hubId)),A(n.visible))).orderBy(Be(i.businessDate),Be(i.id))).map(b=>({...b,businessDate:de(b.businessDate,"YYYY-MM-DD")}))},se=async(n,a,o)=>{let u=await J(a);if(!u)return[];if(ve(n.visible))return[];let h=$e(K,"draft_label"),b=await Te();return(await e.select({reportHubId:i.id,businessDate:i.businessDate,sourceType:i.sourceType}).top(o).from(i).leftJoin(h,G(f(h.hubId,i.id),we(h.labelId,b))).where(G(ce(i.deletedAt),Ue(f(i.userId,u),ce(i.userId),ce(h.hubId)),A(n.visible))).orderBy(Be(i.businessDate),Be(i.id))).map(I=>({...I,businessDate:de(I.businessDate,"YYYY-MM-DD")}))},te=async(n,a)=>{let o=await ee(e.select({hub:xe(i),internal:xe(O),creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,qt`${a}`),ce(i.deletedAt),A(n.visible))).orderBy(Be(i.id)),u=await je(o.map(h=>h.hub.id));return o.map(h=>be(n,{...h,attachments:u.get(h.hub.id)??[]}))},Q=n=>`${U}${n}`,v=new Map,J=async n=>{if(!t.disableUserIdCache&&v.has(n))return v.get(n)??null;let a=await d(n);return a!==null&&!t.disableUserIdCache&&v.set(n,a),a},me=async(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:h,onFetchStart:b}={})=>{let g=await J(a);if(!g)return[];if(ve(n.visible))return[];let I=q(g,Ke(n));return p.getOrFetch({cacheKey:I,fetcher:async()=>{let C=await pe(n,g);return xt(C)?C:(ne.warn("[DailyReportService] ids array is not in stream order; re-sorting (check SQL ORDER BY vs compareIdsStreamOrder, or concurrent row movement during the scan)"),[...C].sort(Qe))},onFetchStart:b,forceRefresh:o,snapshot:u,ttlMsOverride:h??Dt,epochKey:w,refreshAheadRatio:.5})},nt=(n,a,{forceRefresh:o=!1,snapshot:u=!1,ttlMsOverride:h}={})=>{let b=ue(a);return b?ve(n.visible)?Promise.resolve([]):p.getOrFetch({cacheKey:`${Q(b)}:st:${Ke(n)}`,fetcher:()=>te(n,b),forceRefresh:o,snapshot:u,ttlMsOverride:h??k}):Promise.resolve([])},ge=null,Ye=async()=>(ge!==null||(ge=(await e.select({id:V.id}).from(V).where(we(V.name,He)).orderBy(V.id)).map(a=>a.id)),ge),Te=async()=>{let n=await Ye();return n.length>0?n:[-1]},at=async()=>{let n=await Ye();if(n.length===0)return null;let[a]=await e.select({id:V.id}).top(1).from(V).where(f(V.name,Oe));return a?.id??n[0]},Jt=(n,a)=>a!=null?"absent":n!=null?"present":"unknown",je=async n=>{let a=new Map,o=r.attachment,u=t.attachmentIdCodec;if(n.length===0||!o||!u)return a;let h=await e.select({id:o.id,hubId:o.hubId,fileName:o.fileName,fileType:o.fileType,fileSize:o.fileSize,createdAt:o.createdAt,objectCheckedAt:o.objectCheckedAt,objectMissingAt:o.objectMissingAt}).from(o).where(we(o.hubId,n)).orderBy(tt(o.createdAt),tt(o.id));for(let b of h){let g={id:u.encode(Number(b.id)),fileName:String(b.fileName),fileType:b.fileType?String(b.fileType):null,fileSize:b.fileSize!=null?Number(b.fileSize):null,createdAt:de(b.createdAt,"YYYY-MM-DD HH:mm:ss"),state:Jt(b.objectCheckedAt,b.objectMissingAt)},I=a.get(Number(b.hubId));I?I.push(g):a.set(Number(b.hubId),[g])}return a},Gt=async(n,a,o)=>{let u=r.attachment;if(!u||ve(n.visible))return null;let h=await Te(),b=$e(K,"draft_label");return(await e.select({fileName:u.fileName,filePath:u.filePath,fileType:u.fileType,fileSize:u.fileSize}).top(1).from(u).innerJoin(i,f(i.id,u.hubId)).leftJoin(b,G(f(b.hubId,i.id),we(b.labelId,h))).where(G(f(u.id,a),ce(i.deletedAt),Ue(f(i.userId,o),ce(b.hubId)),A(n.visible))))[0]??null},Qt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentMissing failed",u)}},Xt=async n=>{let a=r.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where(f(a.id,n))}catch(u){ne.error("markAttachmentPresent failed",u)}},Wt=async(n,a,o,{forceRefresh:u=!1,snapshot:h=!1,ttlMsOverride:b}={})=>{let g=await J(o);if(!g)return[];let I=ue(a);if(!I)return[];if(ve(n.visible))return[];let C=L(I,g,Ke(n));return p.getOrFetch({cacheKey:C,fetcher:async()=>{let X=await Te(),j=$e(K,"draft_label"),Z=await ee(e.select({hub:xe(i),internal:xe(O),isRead:Y.isRead,isStarred:Y.isStarred,creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(Y,G(f(i.id,Y.hubId),f(Y.userId,g))).leftJoin(j,G(f(j.hubId,i.id),we(j.labelId,X))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.businessDate,qt`${I}`),ce(i.deletedAt),Ue(f(i.userId,g),ce(j.hubId)),A(n.visible))).orderBy(Be(i.id));if(Z.length===0)return[];let oe=Z.map(W=>W.hub.id),Me=await e.select({hubId:K.hubId,id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(we(K.hubId,oe)),Ce=await e.select({hubId:m.hubId,id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(we(m.hubId,oe)).orderBy(tt(m.createdAt)),Ne=await je(oe),Ae=new Map,ie=new Map;for(let W of Me){let le=Ae.get(W.hubId);le||(le=[],Ae.set(W.hubId,le)),le.push({id:W.id,name:W.name,color:W.color})}for(let W of Ce){let le=ie.get(W.hubId);le||(le=[],ie.set(W.hubId,le)),le.push({id:W.id,content:W.body,createdAt:de(W.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:W.userId,userName:W.userName||""})}return Z.map(W=>{let le=W.hub.id;return be(n,{...W,attachments:Ne.get(le)??[],labels:Ae.get(le)||[],postedCommentRows:ie.get(le)||[]},g)})},forceRefresh:u,snapshot:h,ttlMsOverride:b??k,epochKey:`${T}${I}`})},Fe=async(n,a,o,{forceRefresh:u=!1,snapshot:h=!1,ttlMsOverride:b}={})=>{if(ve(n.visible))return null;let g=E(a,o,Ke(n));return(await p.getOrFetch({cacheKey:g,fetcher:async()=>{let C=await Te(),X=$e(K,"draft_label"),j=await ee(e.select({hub:xe(i),internal:xe(O),isRead:Y.isRead,isStarred:Y.isStarred,creatorName:s.displayName,...H()}).from(i)).leftJoin(O,f(i.id,O.hubId)).leftJoin(Y,G(f(i.id,Y.hubId),f(Y.userId,o))).leftJoin(X,G(f(X.hubId,i.id),we(X.labelId,C))).leftJoin(s,f(i.userId,s.id)).where(G(f(i.id,a),ce(i.deletedAt),Ue(f(i.userId,o),ce(X.hubId)),A(n.visible)));if(j.length===0)return[];let Z=j[0].hub.id,oe=await e.select({id:V.id,name:V.name,color:V.color}).from(K).innerJoin(V,f(K.labelId,V.id)).where(f(K.hubId,Z)),Me=await e.select({id:m.id,body:m.body,createdAt:m.createdAt,userId:m.userId,userName:s.displayName}).from(m).leftJoin(s,f(m.userId,s.id)).where(f(m.hubId,Z)).orderBy(tt(m.createdAt)),Ce=await je([Z]),Ne=oe.map(ie=>({id:ie.id,name:ie.name,color:ie.color})),Ae=Me.map(ie=>({id:ie.id,content:ie.body,createdAt:de(ie.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:ie.userId,userName:ie.userName||""}));return[be(n,{...j[0],attachments:Ce.get(Z)??[],labels:Ne,postedCommentRows:Ae},o)]},forceRefresh:u,snapshot:h,ttlMsOverride:b??k,epochKey:`${y}${a}`}))[0]??null},Zt=async(n,a,o,u={})=>{let h=await J(o);return h?Fe(n,a,h,u):null},er=async(n,a)=>{let o=await Te(),u=$e(K,"draft_label"),[h]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt}).top(1).from(i).leftJoin(u,G(f(u.hubId,i.id),we(u.labelId,o))).where(G(f(i.id,n),Ue(f(i.userId,a),ce(u.hubId))));return h??null},st=async(n,a,o)=>{let u=await er(a,o);if(!u||u.deletedAt||!Ie(n.visible,u.sourceType))throw new Error("Not Found")},tr=async(n,a,o,u,h,b)=>{await st(n,o,a);let g=await e.select().top(1).from(Y).where(G(f(Y.hubId,o),f(Y.userId,a))),I;if(g.length>0?g[0].isStarred!==h?I=(await e.update(Y).set({isStarred:h,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(Y.hubId,o),f(Y.userId,a))))[0]:I=g[0]:I=(await e.insert(Y).output().values({hubId:o,userId:a,isStarred:h,isRead:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(M(C,a)),await S(`${T}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(P(o,a)),await S(`${y}${o}`),await N(Xe.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"star",value:h,clientTempId:b}),"setStarStatus"),I},rr=async(n,a,o,u,h,b)=>{await st(n,o,a);let g=await e.select().top(1).from(Y).where(G(f(Y.hubId,o),f(Y.userId,a))),I;if(g.length>0?g[0].isRead!==h?I=(await e.update(Y).set({isRead:h,updatedAt:new Date,updatedBy:String(a)}).output().where(G(f(Y.hubId,o),f(Y.userId,a))))[0]:I=g[0]:I=(await e.insert(Y).output().values({hubId:o,userId:a,isRead:h,isStarred:!1,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}))[0],u){let C=ue(u);C&&(p.invalidatePrefix(M(C,a)),await S(`${T}${C}`))}return p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(P(o,a)),await S(`${y}${o}`),await N(Xe.parse({type:"status-update",reportHubId:o,recipientRawUserId:a,statusType:"read",value:h,clientTempId:b}),"setReadStatus"),I},wt=async(n,a)=>{if(a===null)return;let o=await Te(),[u]=await e.select({hubId:K.hubId}).top(1).from(K).where(G(f(K.hubId,n),we(K.labelId,o)));return u?a:void 0},nr=async(n,a,o,u,h,b)=>{let[g]=await e.select({sourceType:i.sourceType,deletedAt:i.deletedAt,userId:i.userId}).top(1).from(i).where(f(i.id,o));if(!g||g.deletedAt)throw new Error("Not Found");if(await st(n,o,a),!Ie(n.commentable,g.sourceType))throw new Error("Comments are restricted by the viewer's comment permission");if(g.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let I=await wt(o,g.userId),[C]=await e.insert(m).output().values({hubId:o,userId:a,body:u,createdAt:new Date,createdBy:String(a),updatedAt:new Date,updatedBy:String(a)}),[X]=await e.select({displayName:s.displayName}).top(1).from(s).where(f(s.id,a)),j=X?.displayName??"Unknown";if(h){let oe=ue(h);oe&&(p.invalidatePrefix(`daily-report:date:${oe}:user:`),await S(`${T}${oe}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`);let Z={id:C.id,userId:l(C.userId),userName:j,content:C.body,createdAt:de(C.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await N(mt.parse({type:"comment-add",reportHubId:o,comment:Z,clientTempId:b,recipientRawUserId:I,sourceType:g.sourceType}),"addComment"),Z},ar=async(n,a)=>await n.select().top(1).from(m).where(f(m.id,a)),sr=async(n,a,o,u,h,b)=>{let g=await ar(e,u);if(g.length===0)throw new Error("Not Found");if(g[0].hubId!==o)throw new Error("Not Found");let[I]=await e.select({userId:i.userId,sourceType:i.sourceType}).top(1).from(i).where(f(i.id,g[0].hubId));if(!(I&&Ie(n.visible,I.sourceType)))throw new Error("Not Found");if(g[0].userId!==a)throw new Error("Unauthorized");let C=await wt(o,I.userId);if(await e.delete(m).where(f(m.id,u)),h){let X=ue(h);X&&(p.invalidatePrefix(`daily-report:date:${X}:user:`),await S(`${T}${X}`))}p.invalidate(`daily-report:detail:${o}`),p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`),await N(yt.parse({type:"comment-delete",reportHubId:o,commentId:u,clientTempId:b,recipientRawUserId:C,sourceType:I?.sourceType}),"deleteComment")},or=async(n,a,o)=>{ne.info("createDailyReport called",{userId:n,businessDate:a});let[u]=await e.select({displayName:s.displayName}).from(s).where(f(s.id,n)),h=u?.displayName??l(n);try{let b=await rt(async C=>{ne.info("Starting transaction");let X=`internal-temp-${Date.now()}-${Math.random()}`,[j]=await C.insert(i).output().values({sourceType:"Internal",sourceId:X,businessDate:new Date(a),userId:n,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)});await C.update(i).set({sourceId:String(j.id)}).where(f(i.id,j.id)),ne.info("Hub created",j),await C.insert(O).values({hubId:j.id,body:"",createdAt:new Date,createdBy:String(n),updatedAt:new Date,updatedBy:String(n)}),ne.info("Internal created"),ne.info("Calling getDraftLabelId");let Z=await at();ne.info("draftLabelId",Z);let oe=[];return Z&&(await C.insert(K).values({hubId:j.id,labelId:Z,createdAt:new Date,createdBy:String(n)}),oe.push({id:Z,name:Oe,color:null})),ne.info("Label assigned"),{reportHubId:j.id,date:a,createdAt:de(j.createdAt,"YYYY-MM-DD HH:mm:ss"),author:h,userId:l(n),sourceType:"Internal",employeeName:h,updatedBy:l(n),updatedAt:de(j.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:j.title,content:"",externalComments:[],isRead:!0,isStarred:!1,labels:oe,postedComments:[],attachments:[]}}),g=ue(a);g&&p.invalidatePrefix(M(g,n)),p.invalidatePrefix(U),p.invalidatePrefix(he(n)),await S(w),g&&await S(`${T}${g}`);let I=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),b.reportHubId,n,{forceRefresh:!0});if(I){let C=await Ye(),X=I.labels.some(j=>C.includes(j.id));await N(ht.parse({type:"report-create",reportHubId:I.reportHubId,report:I,clientTempId:o,recipientRawUserId:X?n:void 0}),"createDailyReport")}return I??b}catch(b){throw ne.error("Error in createDailyReport",b),b}},Je=async(n,a)=>await n.select().top(1).from(i).where(f(i.id,a)),ot=async(n,a,o)=>{await n.update(i).set(o).where(f(i.id,a))},St=async(n,a,o)=>{await n.update(O).set(o).where(f(O.hubId,a))},It=async(n,a,o)=>{await n.delete(K).where(G(f(K.hubId,a),f(K.labelId,o)))};return{streamKey:F,streamMaxLen:_,clearCache:async()=>{p.clearAll(),v.clear(),ge=null,x&&await S(w),ne.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(n,a)=>{p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w);for(let o of new Set(n))p.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${y}${o}`);for(let o of new Set(a)){let u=ue(o);u&&await S(`${T}${u}`)}},getUserIdByExternalId:J,getDailyReportIdsByExternalId:me,getDailyReportIdsFirstPageByExternalId:se,getDailyReportsByBusinessDate:nt,getDailyReportsByBusinessDateByExternalId:Wt,getDailyReportDetailById:Fe,getDailyReportDetailByIdByExternalId:Zt,getDraftLabelId:at,getAttachmentsByHubIds:je,getAttachmentForUser:Gt,markAttachmentMissing:Qt,markAttachmentPresent:Xt,setStarStatus:tr,setReadStatus:rr,addComment:nr,deleteComment:sr,createDailyReport:or,updateDailyReport:async(n,a,o,u)=>{let h=await Je(e,n);if(!h.length||h[0].deletedAt)throw new Error("Not Found");if(h[0].userId!==a)throw new Error("Unauthorized");await rt(async I=>{o.title!==void 0&&await ot(I,n,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await St(I,n,{body:o.content,updatedAt:new Date,updatedBy:String(a)})}),p.invalidate(`daily-report:detail:${n}`),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),await S(`${y}${n}`);let b=ue(de(h[0].businessDate,"YYYY-MM-DD"));b&&(p.invalidatePrefix(`daily-report:date:${b}:user:`),await S(`${T}${b}`));let g=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});if(g){let I=await Ye(),C=g.labels.some(X=>I.includes(X.id));await N(ft.parse({type:"report-update",reportHubId:g.reportHubId,report:g,clientTempId:u,recipientRawUserId:C?a:void 0}),"updateDailyReport")}},publishDailyReport:async(n,a,o)=>{let u=await Je(e,n);if(!u.length)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");let h=await at();if(!h)return null;if(await It(e,n,h),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w),u[0].businessDate){let I=ue(de(u[0].businessDate,"YYYY-MM-DD"));I&&await S(`${T}${I}`)}let b=ue(de(u[0].businessDate,"YYYY-MM-DD"));b&&p.invalidatePrefix(M(b,a));let g=await Fe(De.unrestricted("post-write self read: the writer always sees the row they just wrote"),n,a,{forceRefresh:!0});return g&&await N(bt.parse({type:"report-publish",reportHubId:g.reportHubId,report:g,clientTempId:o}),"publishDailyReport"),g??null},deleteDailyReport:async(n,a,o)=>{let u=await Je(e,n);if(!u.length||u[0].deletedAt)throw new Error("Not Found");if(u[0].userId!==a)throw new Error("Unauthorized");if(await ot(e,n,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),p.invalidatePrefix(`daily-report:detail:${n}:user:`),p.invalidatePrefix(U),p.invalidatePrefix(Ee),await S(w),u[0].businessDate){let h=ue(de(u[0].businessDate,"YYYY-MM-DD"));h&&await S(`${T}${h}`)}await N(gt.parse({type:"report-delete",reportHubId:n,clientTempId:o,sourceType:u[0].sourceType}),"deleteDailyReport")},findDailyReportHubById:Je,updateDailyReportHub:ot,updateDailyReportInternal:St,deleteDailyReportLabel:It}}import{and as Xr,eq as Vt}from"drizzle-orm";function Wr(t){let e=[],r=t&&t.length>0?t:[{key:"internal",name:"Internal",description:"Internal daily reports"},{key:"external",name:"External",description:"External daily reports"}];for(let s of r){let l=`daily_report_${s.key.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`;e.push({resourceKey:l,name:s.name,description:s.description??`${s.name} daily report access`}),s.includeCommentResource!==!1&&e.push({resourceKey:`${l}_comment`,name:`${s.name} Comment`,description:`${s.name} daily report comment access`})}return e}async function Kn(t,e,r){let s=t,d=e.TMResource,l=r.appKey,R=r.actor??"system:daily-report",p=new Date,x=r.resources??Wr(r.sources);for(let i of x){let O=await s.select().from(d).where(Xr(Vt(d.appKey,l),Vt(d.resourceKey,i.resourceKey)));(!O||O.length===0)&&await s.insert(d).values({appKey:l,resourceKey:i.resourceKey,name:i.name,description:i.description??null,createdAt:p,createdBy:R,updatedAt:p,updatedBy:R})}}var Zr=ye(1,"[DailyReportExternalSource]"),Gn=(t,e,r,s=Zr)=>{if(!t)return[];try{let d=JSON.parse(t);return Array.isArray(d)?d.map(r).filter(l=>l!==null):(s.warn(`Unexpected ${e} format: not an array`),[])}catch(d){return s.warn(`Failed to parse ${e}:`,d),[]}};import{desc as Kt,sql as en}from"drizzle-orm";import{bigint as re,bit as jt,date as tn,datetime2 as ae,foreignKey as Se,index as _e,int as rn,mssqlSchema as nn,nvarchar as z,primaryKey as ke,uniqueIndex as an}from"drizzle-orm/mssql-core";function Zn(t,e){let r=nn(t),s=e.userTable,d=r.table("DailyReportHub",{id:re("id",{mode:"number"}).identity().notNull(),sourceType:z("source_type",{length:20}).notNull(),sourceId:z("source_id",{length:100}).notNull(),sourceIdNum:re("source_id_num",{mode:"number"}).generatedAlwaysAs(en`TRY_CAST(source_id AS BIGINT)`),businessDate:tn("business_date"),userId:re("user_id",{mode:"number"}),title:z("title",{length:200}),summary:z("summary",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull(),deletedAt:ae("deleted_at"),deletedBy:z("deleted_by",{length:50})},m=>[ke({name:`${t}_DailyReportHub_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportHub_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),_e(`${t}_DailyReportHub_business_date_index`).on(m.businessDate),_e(`${t}_DailyReportHub_updated_at_index`).on(m.updatedAt),_e(`${t}_DailyReportHub_source_index`).on(m.sourceType,m.sourceId),_e(`${t}_DailyReportHub_user_id_index`).on(m.userId),_e(`${t}_DailyReportHub_business_date_id_index`).on(Kt(m.businessDate),Kt(m.id)),_e(`${t}_DailyReportHub_deleted_at_index`).on(m.deletedAt)]),l=r.table("DailyReportInternal",{hubId:re("hub_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}),metadata:z("metadata",{length:"max"}),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportInternal_pk`,columns:[m.hubId]}),Se({name:`${t}_DailyReportInternal_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]})]),R=r.table("DailyReportComment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),body:z("body",{length:"max"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportComment_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportComment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportComment_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]}),_e(`${t}_DailyReportComment_hub_id_index`).on(m.hubId)]),p=r.table("DailyReportLabel",{id:re("id",{mode:"number"}).identity().notNull(),userId:re("user_id",{mode:"number"}),name:z("name",{length:50}).notNull(),color:z("color",{length:20}),sortOrder:rn("sort_order"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportLabel_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportLabel_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),x=r.table("DailyReportHub_Label",{hubId:re("hub_id",{mode:"number"}).notNull(),labelId:re("label_id",{mode:"number"}).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportHub_Label_pk`,columns:[m.hubId,m.labelId]}),Se({name:`${t}_DailyReportHub_Label_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[m.labelId],foreignColumns:[p.id]})]),i=r.table("DailyReportUserStatus",{hubId:re("hub_id",{mode:"number"}).notNull(),userId:re("user_id",{mode:"number"}).notNull(),isRead:jt("is_read").default(!1).notNull(),isStarred:jt("is_starred").default(!1).notNull(),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportUserStatus_pk`,columns:[m.hubId,m.userId]}),Se({name:`${t}_DailyReportUserStatus_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[m.userId],foreignColumns:[s.id]})]),O=r.table("DailyReportAttachment",{id:re("id",{mode:"number"}).identity().notNull(),hubId:re("hub_id",{mode:"number"}).notNull(),uploadedBy:re("uploaded_by",{mode:"number"}),sourceKey:z("source_key",{length:200}).notNull(),fileName:z("file_name",{length:255}).notNull(),filePath:z("file_path",{length:"max"}).notNull(),fileType:z("file_type",{length:100}),fileSize:re("file_size",{mode:"number"}),objectCheckedAt:ae("object_checked_at"),objectMissingAt:ae("object_missing_at"),createdAt:ae("created_at").notNull(),createdBy:z("created_by",{length:50}).notNull(),updatedAt:ae("updated_at").notNull(),updatedBy:z("updated_by",{length:50}).notNull()},m=>[ke({name:`${t}_DailyReportAttachment_pk`,columns:[m.id]}),Se({name:`${t}_DailyReportAttachment_hub_id_fk`,columns:[m.hubId],foreignColumns:[d.id]}),Se({name:`${t}_DailyReportAttachment_uploaded_by_fk`,columns:[m.uploadedBy],foreignColumns:[s.id]}),an(`${t}_DailyReportAttachment_source_unique`).on(m.hubId,m.sourceKey),_e(`${t}_DailyReportAttachment_hub_id_index`).on(m.hubId,m.createdAt)]);return{hub:d,internal:l,comment:R,attachment:O,label:p,hubLabel:x,userStatus:i}}function sa(t){t.redis||(t.logger??console).warn("[DailyReport] redis provider is not injected: cross-worker cache invalidation is disabled (staleness is bounded only by TTL) and SSE publishing is skipped.");let e=Ct(t.redis),r=new Ge({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),s=zt({...t,cache:r,epochs:e}),d=new Ze({redis:t.redis,streamKey:s.streamKey,cache:r,logger:t.logger}),l=Ft({authenticate:t.authenticate,resolveVisibleSourceTypes:t.resolveVisibleSourceTypes,service:s,encodeUserId:t.encodeUserId,attachmentIdCodec:t.attachmentIdCodec,readAttachment:t.readAttachment,attachmentMaxBytes:t.attachmentMaxBytes,attachmentRateLimitPerMinute:t.attachmentRateLimitPerMinute,attachmentConcurrency:t.attachmentConcurrency,redis:t.redis,sseReader:d,streamKey:s.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:s,cache:r,epochs:e,sseReader:d,streamKey:s.streamKey,knownSourceTypes:[...new Set(["Internal",...(t.externalSources??[]).map(R=>R.sourceType)])],...l}}export{Ze as DailyReportSseReader,De as DailyReportViewerScope,Ge as SqlResultCache,Or as asciiFallbackFileName,$t as buildVisibleSourceTypeCondition,Pt as computeSourceTypeDigest,Ke as computeViewerScopeDigest,Ft as createDailyReportHandlers,sa as createDailyReportServer,zt as createDailyReportService,Ct as createEpochStore,Wr as defineDailyReportAuthzResources,Zn as defineDailyReportSchema,ve as deniesEverySourceType,Hr as encodeRfc8187,de as formatDateValue,Rt as generateETag,Ie as isSourceTypeVisible,ze as isStreamIdLte,Re as jsonResponseWithETag,Lt as normalizeVisibleSourceTypes,Ot as sanitizeMediaType,Kn as seedDailyReportAuthzResources,Gn as transformJsonArray};
|
|
16
16
|
//# sourceMappingURL=server.mjs.map
|