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