@aiquants/daily-report 0.12.3 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -0
- package/dist/client.d.mts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +5 -5
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +5 -5
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.mts +175 -21
- package/dist/server.d.ts +175 -21
- package/dist/server.js +12 -9
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +12 -9
- package/dist/server.mjs.map +1 -1
- package/dist/{sse-schema-YZh7Pz7i.d.ts → sse-schema-D1oZnFg6.d.ts} +18 -0
- package/dist/{sse-schema-BiUnufrI.d.mts → sse-schema-lMo8yW4e.d.mts} +18 -0
- package/package.json +1 -1
- package/src/client/components/daily-report-attachment-indicator.tsx +1 -1
- package/src/client/components/daily-report-detail-list.tsx +3 -3
- package/src/client/components/daily-report-ids-stream-status.tsx +1 -1
- package/src/client/components/daily-report-list.tsx +3 -3
- package/src/client/components/daily-report-resolved-content.tsx +3 -3
- package/src/lucide-icons.d.ts +3 -3
- package/src/server/handlers.ts +181 -35
- package/src/server/handlers.visibility.spec.ts +458 -0
- package/src/server/ports.ts +48 -0
- package/src/server/service.spec.ts +335 -14
- package/src/server/service.ts +222 -37
- package/src/server/test-helpers/handlers-config.ts +93 -9
- package/src/server/visibility.spec.ts +142 -0
- package/src/server/visibility.ts +189 -0
- package/src/server.spec.ts +72 -0
- package/src/server.ts +20 -1
- package/src/shared/sse-schema.ts +15 -0
package/dist/server.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
"use strict";var $e=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var It=Object.prototype.hasOwnProperty;var At=(t,e)=>{for(var n in e)$e(t,n,{get:e[n],enumerable:!0})},_t=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of St(e))!It.call(t,m)&&m!==n&&$e(t,m,{get:()=>e[m],enumerable:!(i=wt(e,m))||i.enumerable});return t};var Ct=t=>_t($e({},"__esModule",{value:!0}),t);var ir={};At(ir,{DailyReportSseReader:()=>we,SqlResultCache:()=>De,asciiFallbackFileName:()=>ot,createDailyReportHandlers:()=>ze,createDailyReportServer:()=>sr,createDailyReportService:()=>Ke,createEpochStore:()=>Le,defineDailyReportAuthzResources:()=>lt,defineDailyReportSchema:()=>ar,encodeRfc8187:()=>it,formatDateValue:()=>V,generateETag:()=>ke,isStreamIdLte:()=>Se,jsonResponseWithETag:()=>ie,sanitizeMediaType:()=>Fe,seedDailyReportAuthzResources:()=>tr,transformJsonArray:()=>nr});module.exports=Ct(ir);var Le=t=>({async getEpoch(e){try{let n=await t?.getClient();if(!n)return 0;let i=await n.get(e);return i?Number(i):0}catch{return 0}},async incrementEpoch(e){try{let n=await t?.getClient();if(!n)return;await n.incr(e)}catch{}}}),De=class{constructor(e,n){this.config=e;this.epochStore=n;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let n=e.refreshAheadRatio;if(n===void 0)return;let{cacheKey:i}=e,m=this.buckets.get(i);if(!m)return;let c=e.ttlMsOverride??this.config.defaultTtlMs;if(c-(m.expireAt-Date.now())<c*n||this.inFlight.has(i))return;let p;p=(async()=>{let L=e.epochKey?await this.epochStore.getEpoch(e.epochKey):0,u=await e.fetcher();return this.inFlight.get(i)===p&&this.buckets.set(i,{records:u,expireAt:Date.now()+c,epoch:L}),u})(),this.inFlight.set(i,p),p.catch(()=>{}).finally(()=>{this.inFlight.get(i)===p&&this.inFlight.delete(i)})};this.getOrFetch=async e=>{let{cacheKey:n,forceRefresh:i,snapshot:m}=e,c=this.buckets.get(n);if(i&&(this.buckets.delete(n),this.inFlight.delete(n)),!i&&c&&c.expireAt>Date.now())if(e.epochKey){let p=await this.epochStore.getEpoch(e.epochKey);if(c.epoch===p)return this.maybeRefreshAhead(e),m?c.records.map(L=>structuredClone(L)):c.records;this.buckets.delete(n)}else return this.maybeRefreshAhead(e),m?c.records.map(p=>structuredClone(p)):c.records;if(!i&&this.inFlight.has(n)){let p=await this.inFlight.get(n);return m?p.map(L=>structuredClone(L)):p}let A;A=(async()=>{let p=e.epochKey?await this.epochStore.getEpoch(e.epochKey):0,L=await e.fetcher();if(i||this.inFlight.get(n)===A){let u=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(n,{records:L,expireAt:u,epoch:p}),this.buckets.size>500&&this.cleanExpired()}return L})(),i||this.inFlight.set(n,A);try{let p=await A;return m?p.map(L=>structuredClone(L)):p}finally{this.inFlight.get(n)===A&&this.inFlight.delete(n)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let n of this.buckets.keys())n.startsWith(e)&&this.buckets.delete(n);for(let n of this.inFlight.keys())n.startsWith(e)&&this.inFlight.delete(n)}}cleanExpired(){let e=Date.now();for(let[n,i]of this.buckets.entries())i.expireAt<=e&&this.buckets.delete(n)}};var Tt=/^\d{4}-\d{2}-\d{2}$/,Mt=/^\d{4}\/\d{2}\/\d{2}$/,Ge=t=>t<10?`0${t}`:`${t}`,Xe=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),n=Ge(t.getMonth()+1),i=Ge(t.getDate());return`${e}-${n}-${i}`};var re=t=>{if(t==null)return null;if(t instanceof Date)return Xe(t);let e=t.trim();if(e==="")return null;if(Tt.test(e))return e;if(Mt.test(e))return e.replaceAll("/","-");let n=new Date(e);return Xe(n)};var Et=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId;var We=(t,e)=>{let n=t.findIndex(i=>Et({businessDate:i.businessDate,reportHubId:i.reportHubId},e)>0);return n===-1?t.length:n};var se=(t,e,n=console)=>{let i=m=>typeof m=="string"?[`${e} ${m}`]:[e,m];return{debug:(m,...c)=>{t<=0&&n.debug(...i(m),...c)},info:(m,...c)=>{t<=1&&n.info(...i(m),...c)},warn:(m,...c)=>{t<=2&&n.warn(...i(m),...c)},error:(m,...c)=>{t<=3&&n.error(...i(m),...c)}}};var d=require("zod"),kt=d.z.object({name:d.z.string().nullish(),affiliation:d.z.string().nullish()}),vt=d.z.object({name:d.z.string().nullish(),text:d.z.string().nullish(),color:d.z.string().nullish()}),xt=d.z.object({id:d.z.number(),name:d.z.string().nullish(),color:d.z.string().nullish()}),Ve=d.z.object({id:d.z.number(),userId:d.z.string().nullish(),userName:d.z.string().nullish(),content:d.z.string().nullish(),createdAt:d.z.string().nullish(),isMine:d.z.boolean()}),Nt=d.z.object({id:d.z.string(),fileName:d.z.string(),fileType:d.z.string().nullable(),fileSize:d.z.number().nullable(),createdAt:d.z.string().nullable(),state:d.z.enum(["present","absent","unknown"])}),Pe=d.z.object({reportHubId:d.z.number(),date:d.z.string().nullish(),createdAt:d.z.string().nullish(),author:d.z.string().nullish(),userId:d.z.string().nullish(),sourceType:d.z.string().nullish(),employeeName:d.z.string().nullish(),updatedBy:d.z.string().nullish(),updatedAt:d.z.string().nullish(),category:d.z.string().nullish(),creationCategory:d.z.string().nullish(),visitTimeFrom:d.z.string().nullish(),visitTimeTo:d.z.string().nullish(),customerName:d.z.string().nullish(),interviewers:d.z.array(kt),subject:d.z.string().nullish(),content:d.z.string().nullish(),comments:d.z.array(vt),isRead:d.z.boolean(),isStarred:d.z.boolean(),labels:d.z.array(xt),commentItems:d.z.array(Ve),attachments:d.z.array(Nt).default([])}),$t=d.z.object({type:d.z.literal("connected")}),Ee=d.z.object({type:d.z.literal("status-update"),reportHubId:d.z.number(),statusType:d.z.enum(["star","read"]),value:d.z.boolean(),clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Be=d.z.object({type:d.z.literal("comment-add"),reportHubId:d.z.number(),comment:Ve,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Ue=d.z.object({type:d.z.literal("comment-delete"),reportHubId:d.z.number(),commentId:d.z.number(),clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),He=d.z.object({type:d.z.literal("report-create"),reportHubId:d.z.number(),report:Pe,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Ye=d.z.object({type:d.z.literal("report-update"),reportHubId:d.z.number(),report:Pe,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Oe=d.z.object({type:d.z.literal("report-publish"),reportHubId:d.z.number(),report:Pe,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),qe=d.z.object({type:d.z.literal("report-delete"),reportHubId:d.z.number(),clientTempId:d.z.string()}),Ze=d.z.discriminatedUnion("type",[$t,Ee,Be,Ue,He,Ye,Oe,qe]);var et=require("crypto"),ke=t=>{let e=JSON.stringify(t);return`"${(0,et.createHash)("sha256").update(e).digest("hex")}"`};var Lt=se(1,"[Response]"),ie=(t,e,n,i=200,m=Lt)=>{let c=ke(n),A=t.headers.get("If-None-Match");m.info(`[jsonResponseWithETag] ETag: ${c}, If-None-Match: ${A}`);let p=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:c});return e&&p.append("Set-Cookie",e),t.method==="GET"&&i===200&&A===c?new Response(null,{status:304,headers:p}):new Response(JSON.stringify(n),{status:i,headers:p})};var tt=require("events");var Se=(t,e)=>{let[n,i]=t.split("-").map(Number),[m,c]=e.split("-").map(Number);return n!==m?n<m:i<=c},we=class{constructor(e){this.config=e;this._emitter=new tt.EventEmitter;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??se(1,"[SSE Reader]")}subscribe(e,n){return this._emitter.on("entry",e),n&&this._emitter.on("error",n),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),n&&this._emitter.removeListener("error",n),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 n=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=n.length>0?n[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 n of e)for(let i of n.messages){this._lastId=i.id;try{let m=i.message?.data?JSON.parse(i.message.data):null,c=m?.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 A=m?.reportHubId;typeof A=="number"&&(this.config.cache.invalidate(`daily-report:detail:${A}`),this.config.cache.invalidatePrefix(`daily-report:detail:${A}: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 $=(t,e)=>new Response(JSON.stringify(t),{status:e?.status??200,headers:{"Content-Type":"application/json"}}),xe=200,st=4e3,Pt="stream interrupted by server error",Bt=/^\d{4}-\d{2}-\d{2}$/,Ut=15e3,rt=Symbol("ids-stream-heartbeat"),Ht=t=>{let e=t.searchParams.get("cursor_report_hub_id"),n=t.searchParams.get("cursor_business_date");if(e===null)return n===null?{cursor:null}:{invalid:!0};let i=Number.parseInt(e,10);return!Number.isSafeInteger(i)||String(i)!==e||i<=0?{invalid:!0}:n===null?{cursor:{businessDate:null,reportHubId:i}}:Bt.test(n)?{cursor:{businessDate:n,reportHubId:i}}:{invalid:!0}};async function*nt(t,e,n=xe){let i=e?We(t,e):0,m=!0;for(;;){let c=t.slice(i,i+(m?n:st));i+=c.length;let A=i>=t.length,p=c[c.length-1];if(yield{items:c,nextCursor:A||!p?null:{businessDate:p.businessDate,reportHubId:p.reportHubId},isLast:A,...m?{total:t.length}:{}},m=!1,A)return}}var at=(t,e,n,i)=>{let m=new TextEncoder,c=!1,A=null,p=new ReadableStream({async pull(u){if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}let x=null;try{A===null&&(A=e.next());let h=new Promise(pe=>{x=setTimeout(()=>pe(rt),Ut)}),z=await Promise.race([A,h]);if(x!==null&&(clearTimeout(x),x=null),z===rt){if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(m.encode(`
|
|
2
|
-
`));return}A=null;let{value:
|
|
3
|
-
`))}catch(
|
|
4
|
-
`)),u.close()}catch{}}},cancel(){c=!0,e.return(void 0).catch(()=>{})}}),
|
|
5
|
-
data: ${
|
|
1
|
+
"use strict";var ze=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Ht=Object.prototype.hasOwnProperty;var Ot=(t,e)=>{for(var n in e)ze(t,n,{get:e[n],enumerable:!0})},Yt=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let y of Ut(e))!Ht.call(t,y)&&y!==n&&ze(t,y,{get:()=>e[y],enumerable:!(i=Bt(e,y))||i.enumerable});return t};var Ft=t=>Yt(ze({},"__esModule",{value:!0}),t);var Mr={};Ot(Mr,{DailyReportSseReader:()=>Ee,SqlResultCache:()=>Me,asciiFallbackFileName:()=>wt,buildVisibleSourceTypeCondition:()=>tt,computeSourceTypeDigest:()=>ke,createDailyReportHandlers:()=>nt,createDailyReportServer:()=>_r,createDailyReportService:()=>at,createEpochStore:()=>Ke,defineDailyReportAuthzResources:()=>It,defineDailyReportSchema:()=>Cr,deniesEverySourceType:()=>be,encodeRfc8187:()=>St,formatDateValue:()=>te,generateETag:()=>He,isSourceTypeVisible:()=>me,isStreamIdLte:()=>ve,jsonResponseWithETag:()=>de,normalizeVisibleSourceTypes:()=>et,sanitizeMediaType:()=>rt,seedDailyReportAuthzResources:()=>Ir,transformJsonArray:()=>Tr});module.exports=Ft(Mr);var Ke=t=>({async getEpoch(e){try{let n=await t?.getClient();if(!n)return 0;let i=await n.get(e);return i?Number(i):0}catch{return 0}},async incrementEpoch(e){try{let n=await t?.getClient();if(!n)return;await n.incr(e)}catch{}}}),Me=class{constructor(e,n){this.config=e;this.epochStore=n;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.maybeRefreshAhead=e=>{let n=e.refreshAheadRatio;if(n===void 0)return;let{cacheKey:i}=e,y=this.buckets.get(i);if(!y)return;let c=e.ttlMsOverride??this.config.defaultTtlMs;if(c-(y.expireAt-Date.now())<c*n||this.inFlight.has(i))return;let h;h=(async()=>{let N=e.epochKey?await this.epochStore.getEpoch(e.epochKey):0,u=await e.fetcher();return this.inFlight.get(i)===h&&this.buckets.set(i,{records:u,expireAt:Date.now()+c,epoch:N}),u})(),this.inFlight.set(i,h),h.catch(()=>{}).finally(()=>{this.inFlight.get(i)===h&&this.inFlight.delete(i)})};this.getOrFetch=async e=>{let{cacheKey:n,forceRefresh:i,snapshot:y}=e,c=this.buckets.get(n);if(i&&(this.buckets.delete(n),this.inFlight.delete(n)),!i&&c&&c.expireAt>Date.now())if(e.epochKey){let h=await this.epochStore.getEpoch(e.epochKey);if(c.epoch===h)return this.maybeRefreshAhead(e),y?c.records.map(N=>structuredClone(N)):c.records;this.buckets.delete(n)}else return this.maybeRefreshAhead(e),y?c.records.map(h=>structuredClone(h)):c.records;if(!i&&this.inFlight.has(n)){let h=await this.inFlight.get(n);return y?h.map(N=>structuredClone(N)):h}let A;A=(async()=>{let h=e.epochKey?await this.epochStore.getEpoch(e.epochKey):0,N=await e.fetcher();if(i||this.inFlight.get(n)===A){let u=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs);this.buckets.set(n,{records:N,expireAt:u,epoch:h}),this.buckets.size>500&&this.cleanExpired()}return N})(),i||this.inFlight.set(n,A);try{let h=await A;return y?h.map(N=>structuredClone(N)):h}finally{this.inFlight.get(n)===A&&this.inFlight.delete(n)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let n of this.buckets.keys())n.startsWith(e)&&this.buckets.delete(n);for(let n of this.inFlight.keys())n.startsWith(e)&&this.inFlight.delete(n)}}cleanExpired(){let e=Date.now();for(let[n,i]of this.buckets.entries())i.expireAt<=e&&this.buckets.delete(n)}};var qt=/^\d{4}-\d{2}-\d{2}$/,zt=/^\d{4}\/\d{2}\/\d{2}$/,dt=t=>t<10?`0${t}`:`${t}`,ct=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),n=dt(t.getMonth()+1),i=dt(t.getDate());return`${e}-${n}-${i}`};var se=t=>{if(t==null)return null;if(t instanceof Date)return ct(t);let e=t.trim();if(e==="")return null;if(qt.test(e))return e;if(zt.test(e))return e.replaceAll("/","-");let n=new Date(e);return ct(n)};var Kt=(t,e)=>t.businessDate!==e.businessDate?t.businessDate===null?1:e.businessDate===null||t.businessDate>e.businessDate?-1:1:e.reportHubId-t.reportHubId;var pt=(t,e)=>{let n=t.findIndex(i=>Kt({businessDate:i.businessDate,reportHubId:i.reportHubId},e)>0);return n===-1?t.length:n};var le=(t,e,n=console)=>{let i=y=>typeof y=="string"?[`${e} ${y}`]:[e,y];return{debug:(y,...c)=>{t<=0&&n.debug(...i(y),...c)},info:(y,...c)=>{t<=1&&n.info(...i(y),...c)},warn:(y,...c)=>{t<=2&&n.warn(...i(y),...c)},error:(y,...c)=>{t<=3&&n.error(...i(y),...c)}}};var d=require("zod"),Vt=d.z.object({name:d.z.string().nullish(),affiliation:d.z.string().nullish()}),jt=d.z.object({name:d.z.string().nullish(),text:d.z.string().nullish(),color:d.z.string().nullish()}),Jt=d.z.object({id:d.z.number(),name:d.z.string().nullish(),color:d.z.string().nullish()}),mt=d.z.object({id:d.z.number(),userId:d.z.string().nullish(),userName:d.z.string().nullish(),content:d.z.string().nullish(),createdAt:d.z.string().nullish(),isMine:d.z.boolean()}),Gt=d.z.object({id:d.z.string(),fileName:d.z.string(),fileType:d.z.string().nullable(),fileSize:d.z.number().nullable(),createdAt:d.z.string().nullable(),state:d.z.enum(["present","absent","unknown"])}),Ve=d.z.object({reportHubId:d.z.number(),date:d.z.string().nullish(),createdAt:d.z.string().nullish(),author:d.z.string().nullish(),userId:d.z.string().nullish(),sourceType:d.z.string().nullish(),employeeName:d.z.string().nullish(),updatedBy:d.z.string().nullish(),updatedAt:d.z.string().nullish(),category:d.z.string().nullish(),creationCategory:d.z.string().nullish(),visitTimeFrom:d.z.string().nullish(),visitTimeTo:d.z.string().nullish(),customerName:d.z.string().nullish(),interviewers:d.z.array(Vt),subject:d.z.string().nullish(),content:d.z.string().nullish(),comments:d.z.array(jt),isRead:d.z.boolean(),isStarred:d.z.boolean(),labels:d.z.array(Jt),commentItems:d.z.array(mt),attachments:d.z.array(Gt).default([])}),Qt=d.z.object({type:d.z.literal("connected")}),Ue=d.z.object({type:d.z.literal("status-update"),reportHubId:d.z.number(),statusType:d.z.enum(["star","read"]),value:d.z.boolean(),clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),je=d.z.string().optional(),Je=d.z.object({type:d.z.literal("comment-add"),reportHubId:d.z.number(),comment:mt,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional(),sourceType:je}),Ge=d.z.object({type:d.z.literal("comment-delete"),reportHubId:d.z.number(),commentId:d.z.number(),clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional(),sourceType:je}),Qe=d.z.object({type:d.z.literal("report-create"),reportHubId:d.z.number(),report:Ve,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Xe=d.z.object({type:d.z.literal("report-update"),reportHubId:d.z.number(),report:Ve,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),We=d.z.object({type:d.z.literal("report-publish"),reportHubId:d.z.number(),report:Ve,clientTempId:d.z.string(),recipientRawUserId:d.z.number().optional()}),Ze=d.z.object({type:d.z.literal("report-delete"),reportHubId:d.z.number(),clientTempId:d.z.string(),sourceType:je}),yt=d.z.discriminatedUnion("type",[Qt,Ue,Je,Ge,Qe,Xe,We,Ze]);var ht=require("crypto"),He=t=>{let e=JSON.stringify(t);return`"${(0,ht.createHash)("sha256").update(e).digest("hex")}"`};var Xt=le(1,"[Response]"),de=(t,e,n,i=200,y=Xt)=>{let c=He(n),A=t.headers.get("If-None-Match");y.info(`[jsonResponseWithETag] ETag: ${c}, If-None-Match: ${A}`);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:c});return e&&h.append("Set-Cookie",e),t.method==="GET"&&i===200&&A===c?new Response(null,{status:304,headers:h}):new Response(JSON.stringify(n),{status:i,headers:h})};var ft=require("events");var ve=(t,e)=>{let[n,i]=t.split("-").map(Number),[y,c]=e.split("-").map(Number);return n!==y?n<y:i<=c},Ee=class{constructor(e){this.config=e;this._emitter=new ft.EventEmitter;this._state="idle";this._refCount=0;this._lastId="$";this._emitter.setMaxListeners(0),this._logger=e.logger??le(1,"[SSE Reader]")}subscribe(e,n){return this._emitter.on("entry",e),n&&this._emitter.on("error",n),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),n&&this._emitter.removeListener("error",n),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 n=await e.xRevRange(this.config.streamKey,"+","-",{COUNT:1});this._lastId=n.length>0?n[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 n of e)for(let i of n.messages){this._lastId=i.id;try{let y=i.message?.data?JSON.parse(i.message.data):null,c=y?.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 A=y?.reportHubId;typeof A=="number"&&(this.config.cache.invalidate(`daily-report:detail:${A}`),this.config.cache.invalidatePrefix(`daily-report:detail:${A}: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 xe=require("drizzle-orm"),Wt="",Zt=64,er=t=>t.toLowerCase(),tr=t=>t.trim().toLowerCase();function et(t){if(t==null)return null;if(!Array.isArray(t))return new Set;let e=new Set;for(let n of t){if(typeof n!="string")continue;let i=tr(n);i.length>0&&e.add(i)}return e}function me(t,e){return t===null?!0:e==null?!1:t.has(er(e))}function be(t){return t!==null&&t.size===0}function tt(t,e){if(e!==null)return e.size===0?xe.sql`1 = 0`:(0,xe.inArray)(xe.sql`LOWER(${t})`,[...e])}function ke(t){if(t===null)return"all";if(t.size===0)return"none";let e=[...t].sort().join(Wt);if(e.length<=Zt)return e;let n=2166136261;for(let i=0;i<e.length;i++)n^=e.charCodeAt(i),n=Math.imul(n,16777619);return`h:${(n>>>0).toString(16)}`}var $=(t,e)=>new Response(JSON.stringify(t),{status:e?.status??200,headers:{"Content-Type":"application/json"}}),Ye=200,Dt=4e3,rr="stream interrupted by server error",nr=/^\d{4}-\d{2}-\d{2}$/,ar=15e3,bt=Symbol("ids-stream-heartbeat"),sr=12,ir=t=>{let e=t.searchParams.get("cursor_report_hub_id"),n=t.searchParams.get("cursor_business_date");if(e===null)return n===null?{cursor:null}:{invalid:!0};let i=Number.parseInt(e,10);return!Number.isSafeInteger(i)||String(i)!==e||i<=0?{invalid:!0}:n===null?{cursor:{businessDate:null,reportHubId:i}}:nr.test(n)?{cursor:{businessDate:n,reportHubId:i}}:{invalid:!0}};async function*gt(t,e,n=Ye){let i=e?pt(t,e):0,y=!0;for(;;){let c=t.slice(i,i+(y?n:Dt));i+=c.length;let A=i>=t.length,h=c[c.length-1];if(yield{items:c,nextCursor:A||!h?null:{businessDate:h.businessDate,reportHubId:h.reportHubId},isLast:A,...y?{total:t.length}:{}},y=!1,A)return}}var Rt=(t,e,n,i)=>{let y=new TextEncoder,c=!1,A=null,h=new ReadableStream({async pull(u){if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}let P=null;try{A===null&&(A=e.next());let p=new Promise(ce=>{P=setTimeout(()=>ce(bt),ar)}),K=await Promise.race([A,p]);if(P!==null&&(clearTimeout(P),P=null),K===bt){if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(y.encode(`
|
|
2
|
+
`));return}A=null;let{value:z,done:B}=K;if(B){u.close();return}if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(y.encode(`${JSON.stringify(z)}
|
|
3
|
+
`))}catch(p){if(P!==null&&clearTimeout(P),A=null,c||n.signal.aborted)return;i.error(`ids-stream emission failed: ${p instanceof Error?p.message:String(p)}`);try{u.enqueue(y.encode(`${JSON.stringify({error:rr})}
|
|
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(h,{status:200,headers:N})},or=32*1024*1024,lr=60,ur=4,dr=12e4,cr=1024,pr=60,mr=5,yr=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),hr=/^[\x20-\x7E]+$/,fr=/^[\w.+-]+\/[\w.+-]+/,rt=t=>t&&hr.test(t)&&fr.test(t)?t:null,St=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),wt=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),br=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},gr={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},Rr=t=>{let e=new Map;return(n,i)=>{let y=e.get(n);y&&e.delete(n);let c=y??{tokens:t,lastRefillMs:i},A=Math.max(0,i-c.lastRefillMs);A>0&&(c.tokens=Math.min(t,c.tokens+A*t/6e4),c.lastRefillMs=i);let h=c.tokens>=1;for(h&&(c.tokens-=1),e.set(n,c);e.size>cr;){let N=e.keys().next();if(N.done)break;e.delete(N.value)}return h}},Dr=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},Sr=(t,e,n)=>{let i=setTimeout(e,n);i.unref?.();let y=()=>{clearTimeout(i),e()},c=!1;return new ReadableStream({pull(A){if(c){A.close(),y();return}c=!0,A.enqueue(t)},cancel(){y()}})},wr=(t,e,n)=>{if(n===null)return!0;let i=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 me(n,t.report.sourceType);case"comment-add":case"comment-delete":return me(n,i??"Internal");case"report-delete":return me(n,i)}};function nt(t){let{authenticate:e,service:n,encodeUserId:i,redis:y,sseReader:c,streamKey:A}=t,h=t.loginRedirectPath??"/auth/login",N=t.logger??le(3,"[DailyReportAPI]"),u=t.logger??le(3,"[DailyReportVisibility]"),P=t.logger??le(1,"[DailyReportSSE]"),p=t.logger??le(1,"[DailyReportAttachment]"),K=t.attachmentMaxBytes??or,z=Rr(t.attachmentRateLimitPerMinute??lr),B=Dr(t.attachmentConcurrency??ur),ce=async(I,H="initial")=>{let _=t.resolveVisibleSourceTypes;if(!_)return null;try{return et(await _(I,{reason:H}))}catch(E){return u.error("resolveVisibleSourceTypes threw; failing closed (deny all)",E),new Set}},Ae=async({request:I})=>{let{user:H,cookie:_}=await e(I,{failureRedirect:h}),E=new Headers;_&&E.append("Set-Cookie",_);let M=null;H&&(M=await n.getUserIdByExternalId(H.id));let U=M?i(M):null;return{data:{user:H,userId:U},headers:E}},Te={"business-date":async(I,H,_,E,M)=>{let U=se(I.searchParams.get("businessDate")),S=I.searchParams.get("forceRefresh")==="true";if(!U)return de(_,H,{error:{message:"Invalid business date"}},400);let L=await n.getDailyReportsByBusinessDateByExternalId(U,E.id,{forceRefresh:S},M);return de(_,H,{businessDate:U,reports:L},200)},"ids-stream":async(I,H,_,E,M)=>{let U=ir(I);if("invalid"in U)return de(_,H,{error:{message:"Invalid cursor"}},400);let S=I.searchParams.get("forceRefresh")==="true",L=n.getDailyReportIdsByExternalId(E.id,{forceRefresh:S},M);if(L.catch(()=>{}),U.cursor)return Rt(H,gt(await L,U.cursor),_,N);let Y=n.getDailyReportIdsFirstPageByExternalId(E.id,Ye,M);Y.catch(()=>{});let C=(async function*(){let D=await Promise.race([L.then(F=>({kind:"full",items:F}),F=>({kind:"full-error",error:F})),Y.then(F=>({kind:"page",items:F}),()=>({kind:"page-error"}))]),Q=null,v=null;if(D.kind==="full")v=D.items;else if(D.kind==="page"||D.kind==="full-error"){let F=D.kind==="page"?D.items:await Y;if(F.length<Ye){yield{items:F,nextCursor:null,isLast:!0,total:F.length};return}let R=F[F.length-1];Q={businessDate:R.businessDate,reportHubId:R.reportHubId},yield{items:F,nextCursor:Q,isLast:!1}}v===null&&(v=await L),yield*gt(v,Q,Q?Dt:Ye)})();return Rt(H,C,_,N)},report:async(I,H,_,E,M)=>{let U=I.searchParams.get("reportHubId"),S=I.searchParams.get("forceRefresh")==="true",L=U?Number.parseInt(U,10):NaN;if(!Number.isFinite(L)||L<=0)return de(_,H,{error:{message:"Invalid reportHubId"}},400);let Y=await n.getDailyReportDetailByIdByExternalId(L,E.id,{snapshot:!0,forceRefresh:S},M);return Y?de(_,H,{report:Y},200):de(_,H,{error:{message:"Report not found"}},404)}};return{index:{loader:Ae},api:{loader:async({request:I,params:H})=>{let{user:_,cookie:E}=await e(I,{failureRedirect:null}),M=E??null;if(!_)return de(I,M,{error:{message:"Unauthorized"}},401);if(I.method!=="GET")return de(I,M,{error:{message:"Method not allowed"}},405);let U=H.endpoint??"",S=Te[U];if(!S)return de(I,M,{error:{message:"Unknown endpoint"}},404);let L=Date.now();try{let Y=new URL(I.url),C=await ce(I);return await S(Y,M,I,_,C)}catch(Y){let C=Date.now()-L,D=Y instanceof Error?Y:new Error(String(Y));return N.error(`500 endpoint=${U} elapsed=${C}ms name=${D.name} code=${"code"in D?D.code:"N/A"} message=${D.message}`),N.error("Stack:",D.stack),de(I,M,{error:{message:"Internal Server Error"}},500)}},action:async({request:I,params:H})=>{let{user:_}=await e(I,{failureRedirect:null});if(!_)return $({error:"Unauthorized"},{status:401});if(H.endpoint!=="action")return $({error:"Unknown endpoint"},{status:404});let M=await n.getUserIdByExternalId(_.id);if(!M)return $({error:"User not found"},{status:404});let U=await ce(I),S=await I.formData(),L=S.get("intent"),Y=S.get("reportHubId"),C=Y?Number(Y):NaN,D=S.get("businessDate"),Q=Number(S.get("operationTimestamp")),v=S.get("clientTempId");if(L==="clearCache")return t.enableDevCacheClear?(await n.clearCache(),$({status:"OK",intent:"clearCache"})):$({error:"Invalid intent"},{status:400});if(!v)return $({error:"clientTempId required"},{status:400});if(L!=="create"&&(!C||Number.isNaN(C)))return $({error:"Invalid reportHubId"},{status:400});let F=async(R,O,X)=>{let W=S.get(O);if(W===null)return $({error:`${O} required`},{status:400});try{let j=await X(W==="true");return $({status:"OK",intent:R,updatedStatus:{isStarred:j.isStarred,isRead:j.isRead},operationTimestamp:Q,reportHubId:String(C),clientTempId:v})}catch(j){if(j instanceof Error&&j.message==="Not Found")return $({error:"Report not found"},{status:404});throw j}};switch(L){case"create":{if(!D)return $({error:"businessDate required"},{status:400});let R=await n.createDailyReport(M,D,v);return $({status:"OK",intent:"create",report:R,reportHubId:String(R.reportHubId),clientTempId:v})}case"update":{let R=S.get("title"),O=S.get("content");try{return await n.updateDailyReport(C,M,{title:R,content:O},v),$({status:"OK",intent:"update",reportHubId:String(C),clientTempId:v})}catch(X){if(X instanceof Error){if(X.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(X.message==="Not Found")return $({error:"Report not found"},{status:404})}throw X}}case"publish":try{let R=await n.publishDailyReport(C,M,v);return $({status:"OK",intent:"publish",reportHubId:String(C),clientTempId:v,report:R})}catch(R){if(R instanceof Error){if(R.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(R.message==="Not Found")return $({error:"Report not found"},{status:404})}throw R}case"delete":try{return await n.deleteDailyReport(C,M,v),$({status:"OK",intent:"delete",reportHubId:String(C),clientTempId:v})}catch(R){if(R instanceof Error){if(R.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(R.message==="Not Found")return $({error:"Report not found"},{status:404})}throw R}case"toggleStar":return await F("toggleStar","isStarred",R=>n.setStarStatus(M,C,D,R,v,U));case"toggleRead":return await F("toggleRead","isRead",R=>n.setReadStatus(M,C,D,R,v,U));case"addComment":{let R=S.get("content");if(!R)return $({error:"Content required"},{status:400});try{let O=await n.addComment(M,C,R,D,v,U),X={...O,userId:O.userId};return $({status:"OK",intent:"addComment",newComment:X,reportHubId:String(C),clientTempId:v})}catch(O){if(O instanceof Error){if(O.message==="Not Found")return $({error:"Report not found"},{status:404});if(O.message.startsWith("Comments are restricted"))return $({error:"Comments are restricted for this report"},{status:403})}throw O}}case"deleteComment":{let R=Number(S.get("commentId"));if(!R||Number.isNaN(R))return $({error:"Invalid commentId"},{status:400});try{return await n.deleteComment(M,C,R,D,v,U),$({status:"OK",reportHubId:String(C),deletedCommentId:String(R),clientTempId:v})}catch(O){if(O instanceof Error){if(O.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(O.message==="Not Found")return $({error:"Comment not found"},{status:404})}throw O}}default:return $({error:"Invalid intent"},{status:400})}}},sse:{loader:async({request:I,params:H})=>{let{user:_}=await e(I,{failureRedirect:null});if(!_)return new Response("Unauthorized",{status:401});let E=await n.getUserIdByExternalId(_.id);if(!E)return new Response("Forbidden",{status:403});if(H.endpoint!=="updates")return new Response("Not Found",{status:404});let M=await ce(I),U=0,S=0,Y=new URL(I.url).searchParams.get("lastEventId")||I.headers.get("Last-Event-ID"),C=new TextEncoder,D=null,Q=null,v=null,F=!1,R=()=>{if(!F){if(F=!0,Q&&(clearInterval(Q),Q=null),v&&(v(),v=null),D)try{D.desiredSize!==null&&D.close()}catch{}finally{D=null}F=!1}},O=j=>{D&&D.desiredSize!==null&&D.enqueue(C.encode(`id: ${j}
|
|
5
|
+
data: ${JSON.stringify({type:"connected"})}
|
|
6
6
|
|
|
7
|
-
`))}
|
|
7
|
+
`))},X=(j,ee)=>{if(ee.data)try{let k=JSON.parse(ee.data),Z=yt.safeParse(k);if(!Z.success){P.error("SSE message validation failed:",Z.error.format());return}let ie=Z.data,ue=typeof k.recipientRawUserId=="number"?k.recipientRawUserId:void 0;if(ie.type==="status-update"){if(ue===void 0||ue!==E)return}else if(ue!==void 0&&ue!==E)return;if(!wr(ie,k,M)){O(j);return}let oe;if("recipientRawUserId"in k){let{recipientRawUserId:pe,...De}=k;oe=JSON.stringify(De)}else oe=ee.data;D&&D.desiredSize!==null&&D.enqueue(C.encode(`id: ${j}
|
|
8
|
+
data: ${oe}
|
|
8
9
|
|
|
9
|
-
`))
|
|
10
|
+
`))}catch(k){P.error(`[SSE:${E}] processEntry error:`,k)}},W=new ReadableStream({async start(j){D=j,Q=setInterval(()=>{try{if(D&&D.desiredSize!==null){if(D.enqueue(C.encode(`: keep-alive
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
${T}`:T;M.enqueue(P.encode(W))}if(_)try{let T=await m?.getClient();if(T){let W=await T.xRange(A,_,"+",{COUNT:1e3});for(let ee of W)ee.id!==_&&(Se(ee.id,Q)||(Q=ee.id,b(ee.id,ee.message)))}}catch(T){u.error(`[SSE:${v}] catch-up xRange error:`,T)}},cancel(){C()}});return new Response(B,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"}})}},attachment:{loader:async({request:E,params:Y})=>{let k=null,v=(R,_,P)=>{let M=new Headers({"Content-Type":"application/json"});return P!==void 0&&M.set("Retry-After",String(P)),k&&M.append("Set-Cookie",k),new Response(JSON.stringify({error:{message:_}}),{status:R,headers:M})};try{let{user:R,cookie:_}=await e(E,{failureRedirect:null});if(k=_??null,!R)return v(401,"Unauthorized");if(E.method!=="GET"&&E.method!=="HEAD")return v(405,"Method not allowed");let P=t.attachmentIdCodec,M=t.readAttachment;if(!(P&&M))return v(404,"Attachment not found");let D=Y.token??"",w=P.decode(D);if(w===null||!Number.isSafeInteger(w)||w<=0)return v(400,"Invalid attachment token");let N=await n.getUserIdByExternalId(R.id);if(!N)return v(403,"Forbidden");if(!z(N,Date.now()))return x.error(`429 attachment=${w} viewer=${N} reason=rate_limit`),v(429,"Too many requests",Kt);let C=await n.getAttachmentForUser(w,N);if(!C)return x.error(`404 attachment=${w} viewer=${N} reason=not_visible`),v(404,"Attachment not found");if(C.fileSize!=null&&C.fileSize>h)return x.error(`413 attachment=${w} viewer=${N} reason=db_size`),v(413,"Attachment too large");if(!q.tryAcquire())return x.error(`503 attachment=${w} viewer=${N} reason=concurrency`),v(503,"Too many concurrent downloads",Jt);let b=!1,B=()=>{b||(b=!0,q.release())},K=!1;try{let Q=E.method==="HEAD",T=await M(C.filePath,{maxBytes:h,head:Q,principal:i(N)});if(!T.ok){let ne=Xt(T.reason);return T.reason==="not_found"&&n.markAttachmentMissing(w).catch(he=>{x.error(`markAttachmentMissing failed attachment=${w} message=${he instanceof Error?he.message:"unknown"}`)}),x.error(`${ne} attachment=${w} viewer=${N} reason=${T.reason} code=${T.code??"-"}`),v(ne,Wt[ne]??"Attachment storage unavailable")}let W=Fe(C.fileType)??Fe(T.contentType)??"application/octet-stream",ee=jt.has(W),ae=new URL(E.url).searchParams.get("download")==="1",de=ee?W:"application/octet-stream",be=ee&&!ae?"inline":"attachment",oe=T.size??T.bytes.byteLength,ce=new Headers({"Content-Type":de,"Content-Length":String(oe),"Content-Disposition":`${be}; filename="${ot(C.fileName)}"; filename*=UTF-8''${it(C.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return k&&ce.append("Set-Cookie",k),n.markAttachmentPresent(w).catch(ne=>{x.error(`markAttachmentPresent failed attachment=${w} message=${ne instanceof Error?ne.message:"unknown"}`)}),x.info(`200 attachment=${w} viewer=${N} type=${de} disposition=${be} bytes=${oe}`),Q?new Response(null,{status:200,headers:ce}):(K=!0,new Response(er(T.bytes,B,Ft),{status:200,headers:ce}))}finally{K||B()}}catch(R){if(R instanceof Response)throw R;return x.error(`500 attachment=? viewer=? reason=unexpected message=${R instanceof Error?R.message:"unknown"}`),v(500,"Attachment request failed")}}}}}var a=require("drizzle-orm");var ye=t=>(0,a.getColumns)(t),V=(t,e)=>{if(!t)return null;let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return typeof t=="string"?t:null;let i=n.getFullYear(),m=i<0?`-${String(-i).padStart(4,"0")}`:String(i).padStart(4,"0"),c=String(n.getMonth()+1).padStart(2,"0"),A=String(n.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${m}-${c}-${A}`;let p=String(n.getHours()).padStart(2,"0"),L=String(n.getMinutes()).padStart(2,"0"),u=String(n.getSeconds()).padStart(2,"0");return`${m}-${c}-${A} ${p}:${L}:${u}`};function Ke(t){let{db:e,tables:n,userTable:i,resolveUserId:m,encodeUserId:c,redis:A,cache:p,epochs:L}=t,{hub:u,internal:x,comment:h,label:z,hubLabel:q,userStatus:H}=n,pe=t.externalSources??[],_e=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Ce=_e[0]??"\u4E0B\u66F8\u304D",Z=t.logger??se(1,"[DailyReportService]"),ge="daily-report:ids",E=t.idsTtlMs??18e4,Y="daily-report:ids:epoch",k="daily-report:business-date:",v=t.businessDateTtlMs??3e5,R="daily-report:date-epoch:",_="daily-report:detail-epoch:",P=t.streamKey??"daily-report:sse-stream",M=t.streamMaxLen??1e4,D=r=>L.incrementEpoch(r),w=async(r,s)=>{let o=await A?.getClient();if(!o){Z.warn(`[SSE] Redis client unavailable (${s})`);return}let y=Date.now();try{await o.xAdd(P,"*",{data:JSON.stringify(r)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:M}});let g=Date.now()-y;g>1e3&&Z.warn(`[SSE] Slow publish (${s}): ${g}ms`)}catch(g){Z.error(`[SSE] Redis publish failed (${s}):`,g)}},N=r=>r==null||r===""?null:/^\d+$/.test(r)?c(Number(r)):r,C=()=>{let r={};for(let s of pe)r[`ext_${s.sourceType}`]=ye(s.table);return r},b=r=>{let s=r;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},B=(r,s)=>{let{hub:o,internal:y}=r,g=o.summary,f=[],S=null,I=null,F=null,j=null,O=null,G=null,le=[],me=pe.find(U=>U.sourceType===o.sourceType),fe=me?r[`ext_${me.sourceType}`]:void 0;if(me&&fe){let U=me.mapRow(fe);U.content!==void 0&&(g=U.content),U.employeeName!==void 0&&(G=U.employeeName),U.category!==void 0&&(S=U.category),U.creationCategory!==void 0&&(I=U.creationCategory),U.visitTimeFrom!==void 0&&(F=U.visitTimeFrom),U.visitTimeTo!==void 0&&(j=U.visitTimeTo),U.customerName!==void 0&&(O=U.customerName),U.interviewers!==void 0&&(f=U.interviewers),U.comments!==void 0&&(le=U.comments)}else o.sourceType==="Internal"&&y&&(g=y.body);let ue=(r.labels??[]).map(U=>({id:U.id,name:U.name,color:U.color})),te=r.comments??[],J=I?_e.includes(I):!1,X=oe?.[0]??null;return J&&X&&!ue.some(U=>U.id===X)&&ue.push({id:X,name:Ce,color:null}),{reportHubId:o.id,date:V(o.businessDate,"YYYY-MM-DD"),author:r.creatorName??N(o.createdBy)??"",userId:o.userId?c(o.userId):"",sourceType:o.sourceType??"Internal",createdAt:V(o.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:V(o.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:N(o.updatedBy),employeeName:G??r.creatorName??N(o.createdBy),category:S,creationCategory:I,visitTimeFrom:F,visitTimeTo:j,customerName:O,interviewers:f,subject:o.title,content:g,comments:le,isRead:r.isRead??!1,isStarred:r.isStarred??!1,labels:ue,commentItems:te.map(U=>({...U,userId:c(U.userId),isMine:s?U.userId===s:!1})),attachments:r.attachments}},K=async r=>{let s=(0,a.aliasedTable)(q,"draft_label"),o=await ne();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).from(u).leftJoin(s,(0,a.and)((0,a.eq)(s.hubId,u.id),(0,a.inArray)(s.labelId,o))).where((0,a.and)((0,a.isNull)(u.deletedAt),(0,a.or)((0,a.eq)(u.userId,r),(0,a.isNull)(u.userId),(0,a.isNull)(s.hubId)))).orderBy((0,a.desc)(u.businessDate),(0,a.desc)(u.id))).map(g=>({...g,businessDate:V(g.businessDate,"YYYY-MM-DD")}))},Q=async(r,s)=>{let o=await ae(r);if(!o)return[];let y=(0,a.aliasedTable)(q,"draft_label"),g=await ne();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).top(s).from(u).leftJoin(y,(0,a.and)((0,a.eq)(y.hubId,u.id),(0,a.inArray)(y.labelId,g))).where((0,a.and)((0,a.isNull)(u.deletedAt),(0,a.or)((0,a.eq)(u.userId,o),(0,a.isNull)(u.userId),(0,a.isNull)(y.hubId)))).orderBy((0,a.desc)(u.businessDate),(0,a.desc)(u.id))).map(S=>({...S,businessDate:V(S.businessDate,"YYYY-MM-DD")}))},T=async r=>{let s=await b(e.select({hub:ye(u),internal:ye(x),creatorName:i.displayName,...C()}).from(u)).leftJoin(x,(0,a.eq)(u.id,x.hubId)).leftJoin(i,(0,a.eq)(u.userId,i.id)).where((0,a.and)((0,a.eq)(u.businessDate,a.sql`${r}`),(0,a.isNull)(u.deletedAt))).orderBy((0,a.desc)(u.id)),o=await Te(s.map(y=>y.hub.id));return s.map(y=>B({...y,attachments:o.get(y.hub.id)??[]}))},W=r=>`${k}${r}`,ee=new Map,ae=async r=>{if(!t.disableUserIdCache&&ee.has(r))return ee.get(r)??null;let s=await m(r);return s!==null&&!t.disableUserIdCache&&ee.set(r,s),s},de=async(r,{forceRefresh:s=!1,snapshot:o=!1,ttlMsOverride:y}={})=>{let g=await ae(r);if(!g)return[];let f=`${ge}:user:${g}`;return p.getOrFetch({cacheKey:f,fetcher:async()=>await K(g),forceRefresh:s,snapshot:o,ttlMsOverride:y??E,epochKey:Y,refreshAheadRatio:.5})},be=(r,{forceRefresh:s=!1,snapshot:o=!1,ttlMsOverride:y}={})=>{let g=re(r);return g?p.getOrFetch({cacheKey:W(g),fetcher:()=>T(g),forceRefresh:s,snapshot:o,ttlMsOverride:y??v}):Promise.resolve([])},oe=null,ce=async()=>(oe!==null||(oe=(await e.select({id:z.id}).from(z).where((0,a.inArray)(z.name,_e)).orderBy(z.id)).map(s=>s.id)),oe),ne=async()=>{let r=await ce();return r.length>0?r:[-1]},he=async()=>{let r=await ce();if(r.length===0)return null;let[s]=await e.select({id:z.id}).top(1).from(z).where((0,a.eq)(z.name,Ce));return s?.id??r[0]},ut=(r,s)=>s!=null?"absent":r!=null?"present":"unknown",Te=async r=>{let s=new Map,o=n.attachment,y=t.attachmentIdCodec;if(r.length===0||!o||!y)return s;let g=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,r)).orderBy((0,a.asc)(o.createdAt),(0,a.asc)(o.id));for(let f of g){let S={id:y.encode(Number(f.id)),fileName:String(f.fileName),fileType:f.fileType?String(f.fileType):null,fileSize:f.fileSize!=null?Number(f.fileSize):null,createdAt:V(f.createdAt,"YYYY-MM-DD HH:mm:ss"),state:ut(f.objectCheckedAt,f.objectMissingAt)},I=s.get(Number(f.hubId));I?I.push(S):s.set(Number(f.hubId),[S])}return s},dt=async(r,s)=>{let o=n.attachment;if(!o)return null;let y=await ne(),g=(0,a.aliasedTable)(q,"draft_label");return(await e.select({fileName:o.fileName,filePath:o.filePath,fileType:o.fileType,fileSize:o.fileSize}).top(1).from(o).innerJoin(u,(0,a.eq)(u.id,o.hubId)).leftJoin(g,(0,a.and)((0,a.eq)(g.hubId,u.id),(0,a.inArray)(g.labelId,y))).where((0,a.and)((0,a.eq)(o.id,r),(0,a.isNull)(u.deletedAt),(0,a.or)((0,a.eq)(u.userId,s),(0,a.isNull)(g.hubId)))))[0]??null},ct=async r=>{let s=n.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,r))}catch(y){Z.error("markAttachmentMissing failed",y)}},mt=async r=>{let s=n.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,r))}catch(y){Z.error("markAttachmentPresent failed",y)}},pt=async(r,s,{forceRefresh:o=!1,snapshot:y=!1,ttlMsOverride:g}={})=>{let f=await ae(s);if(!f)return[];let S=re(r);if(!S)return[];let I=`daily-report:date:${S}:user:${f}`;return p.getOrFetch({cacheKey:I,fetcher:async()=>{let F=await ne(),j=(0,a.aliasedTable)(q,"draft_label"),O=await b(e.select({hub:ye(u),internal:ye(x),isRead:H.isRead,isStarred:H.isStarred,creatorName:i.displayName,...C()}).from(u)).leftJoin(x,(0,a.eq)(u.id,x.hubId)).leftJoin(H,(0,a.and)((0,a.eq)(u.id,H.hubId),(0,a.eq)(H.userId,f))).leftJoin(j,(0,a.and)((0,a.eq)(j.hubId,u.id),(0,a.inArray)(j.labelId,F))).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),(0,a.or)((0,a.eq)(u.userId,f),(0,a.isNull)(j.hubId)))).orderBy((0,a.desc)(u.id));if(O.length===0)return[];let G=O.map(J=>J.hub.id),le=await e.select({hubId:q.hubId,id:z.id,name:z.name,color:z.color}).from(q).innerJoin(z,(0,a.eq)(q.labelId,z.id)).where((0,a.inArray)(q.hubId,G)),me=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,G)).orderBy((0,a.asc)(h.createdAt)),fe=await Te(G),ue=new Map,te=new Map;for(let J of le){let X=ue.get(J.hubId);X||(X=[],ue.set(J.hubId,X)),X.push({id:J.id,name:J.name,color:J.color})}for(let J of me){let X=te.get(J.hubId);X||(X=[],te.set(J.hubId,X)),X.push({id:J.id,content:J.body,createdAt:V(J.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:J.userId,userName:J.userName||""})}return O.map(J=>{let X=J.hub.id;return B({...J,attachments:fe.get(X)??[],labels:ue.get(X)||[],comments:te.get(X)||[]},f)})},forceRefresh:o,snapshot:y,ttlMsOverride:g??v,epochKey:`${R}${S}`})},Re=async(r,s,{forceRefresh:o=!1,snapshot:y=!1,ttlMsOverride:g}={})=>{let f=`daily-report:detail:${r}:user:${s}`;return(await p.getOrFetch({cacheKey:f,fetcher:async()=>{let I=await ne(),F=(0,a.aliasedTable)(q,"draft_label"),j=await b(e.select({hub:ye(u),internal:ye(x),isRead:H.isRead,isStarred:H.isStarred,creatorName:i.displayName,...C()}).from(u)).leftJoin(x,(0,a.eq)(u.id,x.hubId)).leftJoin(H,(0,a.and)((0,a.eq)(u.id,H.hubId),(0,a.eq)(H.userId,s))).leftJoin(F,(0,a.and)((0,a.eq)(F.hubId,u.id),(0,a.inArray)(F.labelId,I))).leftJoin(i,(0,a.eq)(u.userId,i.id)).where((0,a.and)((0,a.eq)(u.id,r),(0,a.isNull)(u.deletedAt),(0,a.or)((0,a.eq)(u.userId,s),(0,a.isNull)(F.hubId))));if(j.length===0)return[];let O=j[0].hub.id,G=await e.select({id:z.id,name:z.name,color:z.color}).from(q).innerJoin(z,(0,a.eq)(q.labelId,z.id)).where((0,a.eq)(q.hubId,O)),le=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,O)).orderBy((0,a.asc)(h.createdAt)),me=await Te([O]),fe=G.map(te=>({id:te.id,name:te.name,color:te.color})),ue=le.map(te=>({id:te.id,content:te.body,createdAt:V(te.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:te.userId,userName:te.userName||""}));return[B({...j[0],attachments:me.get(O)??[],labels:fe,comments:ue},s)]},forceRefresh:o,snapshot:y,ttlMsOverride:g??v,epochKey:`${_}${r}`}))[0]??null},yt=async(r,s,o={})=>{let y=await ae(s);return y?Re(r,y,o):null},ht=async(r,s,o,y,g)=>{let f=await e.select().top(1).from(H).where((0,a.and)((0,a.eq)(H.hubId,s),(0,a.eq)(H.userId,r))),S;if(f.length>0?f[0].isStarred!==y?S=(await e.update(H).set({isStarred:y,updatedAt:new Date,updatedBy:String(r)}).output().where((0,a.and)((0,a.eq)(H.hubId,s),(0,a.eq)(H.userId,r))))[0]:S=f[0]:S=(await e.insert(H).output().values({hubId:s,userId:r,isStarred:y,isRead:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let I=re(o);I&&(p.invalidate(`daily-report:date:${I}:user:${r}`),await D(`${R}${I}`))}return p.invalidate(`daily-report:detail:${s}`),p.invalidate(`daily-report:detail:${s}:user:${r}`),await D(`${_}${s}`),await w(Ee.parse({type:"status-update",reportHubId:s,recipientRawUserId:r,statusType:"star",value:y,clientTempId:g}),"setStarStatus"),S},ft=async(r,s,o,y,g)=>{let f=await e.select().top(1).from(H).where((0,a.and)((0,a.eq)(H.hubId,s),(0,a.eq)(H.userId,r))),S;if(f.length>0?f[0].isRead!==y?S=(await e.update(H).set({isRead:y,updatedAt:new Date,updatedBy:String(r)}).output().where((0,a.and)((0,a.eq)(H.hubId,s),(0,a.eq)(H.userId,r))))[0]:S=f[0]:S=(await e.insert(H).output().values({hubId:s,userId:r,isRead:y,isStarred:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let I=re(o);I&&(p.invalidate(`daily-report:date:${I}:user:${r}`),await D(`${R}${I}`))}return p.invalidate(`daily-report:detail:${s}`),p.invalidate(`daily-report:detail:${s}:user:${r}`),await D(`${_}${s}`),await w(Ee.parse({type:"status-update",reportHubId:s,recipientRawUserId:r,statusType:"read",value:y,clientTempId:g}),"setReadStatus"),S},Je=async(r,s)=>{if(s===null)return;let o=await ne(),[y]=await e.select({hubId:q.hubId}).top(1).from(q).where((0,a.and)((0,a.eq)(q.hubId,r),(0,a.inArray)(q.labelId,o)));return y?s:void 0},gt=async(r,s,o,y,g)=>{let[f]=await e.select({sourceType:u.sourceType,deletedAt:u.deletedAt,userId:u.userId}).top(1).from(u).where((0,a.eq)(u.id,s));if(!f||f.deletedAt)throw new Error("Not Found");if(f.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let S=await Je(s,f.userId),[I]=await e.insert(h).output().values({hubId:s,userId:r,body:o,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),[F]=await e.select({displayName:i.displayName}).top(1).from(i).where((0,a.eq)(i.id,r)),j=F?.displayName??"Unknown";if(y){let G=re(y);G&&(p.invalidatePrefix(`daily-report:date:${G}:user:`),await D(`${R}${G}`))}p.invalidate(`daily-report:detail:${s}`),p.invalidatePrefix(`daily-report:detail:${s}:user:`),await D(`${_}${s}`);let O={id:I.id,userId:c(I.userId),userName:j,content:I.body,createdAt:V(I.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await w(Be.parse({type:"comment-add",reportHubId:s,comment:O,clientTempId:g,recipientRawUserId:S}),"addComment"),O},bt=async(r,s)=>await r.select().top(1).from(h).where((0,a.eq)(h.id,s)),Rt=async(r,s,o,y,g)=>{let f=await bt(e,o);if(f.length===0)throw new Error("Not Found");if(f[0].userId!==r)throw new Error("Unauthorized");if(f[0].hubId!==s)throw new Error("Not Found");let[S]=await e.select({userId:u.userId}).top(1).from(u).where((0,a.eq)(u.id,s)),I=await Je(s,S?.userId??null);if(await e.delete(h).where((0,a.eq)(h.id,o)),y){let F=re(y);F&&(p.invalidatePrefix(`daily-report:date:${F}:user:`),await D(`${R}${F}`))}p.invalidate(`daily-report:detail:${s}`),p.invalidatePrefix(`daily-report:detail:${s}:user:`),await D(`${_}${s}`),await w(Ue.parse({type:"comment-delete",reportHubId:s,commentId:o,clientTempId:g,recipientRawUserId:I}),"deleteComment")},Dt=async(r,s,o)=>{Z.info("createDailyReport called",{userId:r,businessDate:s});let[y]=await e.select({displayName:i.displayName}).from(i).where((0,a.eq)(i.id,r)),g=y?.displayName??c(r);try{let f=await e.transaction(async F=>{Z.info("Starting transaction");let j=`internal-temp-${Date.now()}-${Math.random()}`,[O]=await F.insert(u).output().values({sourceType:"Internal",sourceId:j,businessDate:new Date(s),userId:r,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)});await F.update(u).set({sourceId:String(O.id)}).where((0,a.eq)(u.id,O.id)),Z.info("Hub created",O),await F.insert(x).values({hubId:O.id,body:"",createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),Z.info("Internal created"),Z.info("Calling getDraftLabelId");let G=await he();Z.info("draftLabelId",G);let le=[];return G&&(await F.insert(q).values({hubId:O.id,labelId:G,createdAt:new Date,createdBy:String(r)}),le.push({id:G,name:Ce,color:null})),Z.info("Label assigned"),{reportHubId:O.id,date:s,createdAt:V(O.createdAt,"YYYY-MM-DD HH:mm:ss"),author:g,userId:c(r),sourceType:"Internal",employeeName:g,updatedBy:c(r),updatedAt:V(O.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:O.title,content:"",comments:[],isRead:!0,isStarred:!1,labels:le,commentItems:[],attachments:[]}}),S=re(s);S&&p.invalidate(`daily-report:date:${S}:user:${r}`),p.invalidatePrefix(k),p.invalidate(`${ge}:user:${r}`),await D(Y),S&&await D(`${R}${S}`);let I=await Re(f.reportHubId,r,{forceRefresh:!0});if(I){let F=await ce(),j=I.labels.some(O=>F.includes(O.id));await w(He.parse({type:"report-create",reportHubId:I.reportHubId,report:I,clientTempId:o,recipientRawUserId:j?r:void 0}),"createDailyReport")}return I??f}catch(f){throw Z.error("Error in createDailyReport",f),f}},Me=async(r,s)=>await r.select().top(1).from(u).where((0,a.eq)(u.id,s)),Ne=async(r,s,o)=>{await r.update(u).set(o).where((0,a.eq)(u.id,s))},je=async(r,s,o)=>{await r.update(x).set(o).where((0,a.eq)(x.hubId,s))},Qe=async(r,s,o)=>{await r.delete(q).where((0,a.and)((0,a.eq)(q.hubId,s),(0,a.eq)(q.labelId,o)))};return{streamKey:P,streamMaxLen:M,clearCache:async()=>{p.clearAll(),ee.clear(),oe=null,L&&await D(Y),Z.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(r,s)=>{p.invalidatePrefix(k);for(let o of new Set(r))p.invalidatePrefix(`daily-report:detail:${o}:user:`),await D(`${_}${o}`);for(let o of new Set(s)){let y=re(o);y&&await D(`${R}${y}`)}},getUserIdByExternalId:ae,getDailyReportIdsByExternalId:de,getDailyReportIdsFirstPageByExternalId:Q,getDailyReportsByBusinessDate:be,getDailyReportsByBusinessDateByExternalId:pt,getDailyReportDetailById:Re,getDailyReportDetailByIdByExternalId:yt,getDraftLabelId:he,getAttachmentsByHubIds:Te,getAttachmentForUser:dt,markAttachmentMissing:ct,markAttachmentPresent:mt,setStarStatus:ht,setReadStatus:ft,addComment:gt,deleteComment:Rt,createDailyReport:Dt,updateDailyReport:async(r,s,o,y)=>{let g=await Me(e,r);if(!g.length||g[0].deletedAt)throw new Error("Not Found");if(g[0].userId!==s)throw new Error("Unauthorized");await e.transaction(async I=>{o.title!==void 0&&await Ne(I,r,{title:o.title,updatedAt:new Date,updatedBy:String(s)}),o.content!==void 0&&await je(I,r,{body:o.content,updatedAt:new Date,updatedBy:String(s)})}),p.invalidate(`daily-report:detail:${r}`),p.invalidatePrefix(`daily-report:detail:${r}:user:`),p.invalidatePrefix(k),await D(`${_}${r}`);let f=re(V(g[0].businessDate,"YYYY-MM-DD"));f&&(p.invalidatePrefix(`daily-report:date:${f}:user:`),await D(`${R}${f}`));let S=await Re(r,s,{forceRefresh:!0});if(S){let I=await ce(),F=S.labels.some(j=>I.includes(j.id));await w(Ye.parse({type:"report-update",reportHubId:S.reportHubId,report:S,clientTempId:y,recipientRawUserId:F?s:void 0}),"updateDailyReport")}},publishDailyReport:async(r,s,o)=>{let y=await Me(e,r);if(!y.length)throw new Error("Not Found");if(y[0].userId!==s)throw new Error("Unauthorized");let g=await he();if(!g)return null;if(await Qe(e,r,g),p.invalidatePrefix(`daily-report:detail:${r}:user:`),p.invalidatePrefix(k),p.invalidatePrefix(ge),await D(Y),y[0].businessDate){let I=re(V(y[0].businessDate,"YYYY-MM-DD"));I&&await D(`${R}${I}`)}let f=re(V(y[0].businessDate,"YYYY-MM-DD"));f&&p.invalidate(`daily-report:date:${f}:user:${s}`);let S=await Re(r,s,{forceRefresh:!0});return S&&await w(Oe.parse({type:"report-publish",reportHubId:S.reportHubId,report:S,clientTempId:o}),"publishDailyReport"),S??null},deleteDailyReport:async(r,s,o)=>{let y=await Me(e,r);if(!y.length||y[0].deletedAt)throw new Error("Not Found");if(y[0].userId!==s)throw new Error("Unauthorized");if(await Ne(e,r,{deletedAt:new Date,deletedBy:String(s),updatedAt:new Date,updatedBy:String(s)}),p.invalidatePrefix(`daily-report:detail:${r}:user:`),p.invalidatePrefix(k),p.invalidatePrefix(ge),await D(Y),y[0].businessDate){let g=re(V(y[0].businessDate,"YYYY-MM-DD"));g&&await D(`${R}${g}`)}await w(qe.parse({type:"report-delete",reportHubId:r,clientTempId:o}),"deleteDailyReport")},findDailyReportHubById:Me,updateDailyReportHub:Ne,updateDailyReportInternal:je,deleteDailyReportLabel:Qe}}var Ie=require("drizzle-orm");function lt(t){let e=[],n=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 n){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 tr(t,e,n){let i=t,m=e.TMResource,c=n.appKey,A=n.actor??"system:daily-report",p=new Date,L=n.resources??lt(n.sources);for(let u of L){let x=await i.select().from(m).where((0,Ie.and)((0,Ie.eq)(m.appKey,c),(0,Ie.eq)(m.resourceKey,u.resourceKey)));(!x||x.length===0)&&await i.insert(m).values({appKey:c,resourceKey:u.resourceKey,name:u.name,description:u.description??null,createdAt:p,createdBy:A,updatedAt:p,updatedBy:A})}}var rr=se(1,"[DailyReportExternalSource]"),nr=(t,e,n,i=rr)=>{if(!t)return[];try{let m=JSON.parse(t);return Array.isArray(m)?m.map(n).filter(c=>c!==null):(i.warn(`Unexpected ${e} format: not an array`),[])}catch(m){return i.warn(`Failed to parse ${e}:`,m),[]}};var Ae=require("drizzle-orm"),l=require("drizzle-orm/mssql-core");function ar(t,e){let n=(0,l.mssqlSchema)(t),i=e.userTable,m=n.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(Ae.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,Ae.desc)(h.businessDate),(0,Ae.desc)(h.id)),(0,l.index)(`${t}_DailyReportHub_deleted_at_index`).on(h.deletedAt)]),c=n.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:[m.id]})]),A=n.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:[m.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)]),p=n.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]})]),L=n.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:[m.id]}),(0,l.foreignKey)({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[h.labelId],foreignColumns:[p.id]})]),u=n.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:[m.id]}),(0,l.foreignKey)({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[h.userId],foreignColumns:[i.id]})]),x=n.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:[m.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:m,internal:c,comment:A,attachment:x,label:p,hubLabel:L,userStatus:u}}function sr(t){let e=Le(t.redis),n=new De({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),i=Ke({...t,cache:n,epochs:e}),m=new we({redis:t.redis,streamKey:i.streamKey,cache:n,logger:t.logger}),c=ze({authenticate:t.authenticate,service:i,encodeUserId:t.encodeUserId,attachmentIdCodec:t.attachmentIdCodec,readAttachment:t.readAttachment,attachmentMaxBytes:t.attachmentMaxBytes,attachmentRateLimitPerMinute:t.attachmentRateLimitPerMinute,attachmentConcurrency:t.attachmentConcurrency,redis:t.redis,sseReader:m,streamKey:i.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:i,cache:n,epochs:e,sseReader:m,streamKey:i.streamKey,...c}}0&&(module.exports={DailyReportSseReader,SqlResultCache,asciiFallbackFileName,createDailyReportHandlers,createDailyReportServer,createDailyReportService,createEpochStore,defineDailyReportAuthzResources,defineDailyReportSchema,encodeRfc8187,formatDateValue,generateETag,isStreamIdLte,jsonResponseWithETag,sanitizeMediaType,seedDailyReportAuthzResources,transformJsonArray});
|
|
12
|
+
`)),++U%sr===0){let k=++S;ce(I,"refresh").then(Z=>{k===S&&(M=Z)})}}else R()}catch{R()}},5e3),I.signal.addEventListener("abort",()=>{R()});let ee=Y||"0-0";if(v=c.subscribe(k=>{ve(k.id,ee)||(ee=k.id,X(k.id,k.message))},k=>{P.error(`[SSE:${E}] Fan-Out reader error:`,k),R()}),!Y)try{let k=await y?.getClient();if(k){let Z=await k.xRevRange(A,"+","-",{COUNT:1});Z.length>0&&!ve(Z[0].id,ee)&&(ee=Z[0].id)}}catch{}if(D&&D.desiredSize!==null){let k=`data: ${JSON.stringify({type:"connected"})}
|
|
13
|
+
|
|
14
|
+
`,Z=ee!=="0-0"?`id: ${ee}
|
|
15
|
+
${k}`:k;D.enqueue(C.encode(Z))}if(Y)try{let k=await y?.getClient();if(k){let Z=await k.xRange(A,Y,"+",{COUNT:1e3});for(let ie of Z)ie.id!==Y&&(ve(ie.id,ee)||(ee=ie.id,X(ie.id,ie.message)))}}catch(k){P.error(`[SSE:${E}] catch-up xRange error:`,k)}},cancel(){R()}});return new Response(W,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"}})}},attachment:{loader:async({request:I,params:H})=>{let _=null,E=(M,U,S)=>{let L=new Headers({"Content-Type":"application/json"});return S!==void 0&&L.set("Retry-After",String(S)),_&&L.append("Set-Cookie",_),new Response(JSON.stringify({error:{message:U}}),{status:M,headers:L})};try{let{user:M,cookie:U}=await e(I,{failureRedirect:null});if(_=U??null,!M)return E(401,"Unauthorized");if(I.method!=="GET"&&I.method!=="HEAD")return E(405,"Method not allowed");let S=t.attachmentIdCodec,L=t.readAttachment;if(!(S&&L))return E(404,"Attachment not found");let Y=H.token??"",C=S.decode(Y);if(C===null||!Number.isSafeInteger(C)||C<=0)return E(400,"Invalid attachment token");let D=await n.getUserIdByExternalId(M.id);if(!D)return E(403,"Forbidden");if(!z(D,Date.now()))return p.error(`429 attachment=${C} viewer=${D} reason=rate_limit`),E(429,"Too many requests",pr);let Q=await ce(I),v=await n.getAttachmentForUser(C,D,Q);if(!v)return p.error(`404 attachment=${C} viewer=${D} reason=not_visible`),E(404,"Attachment not found");if(v.fileSize!=null&&v.fileSize>K)return p.error(`413 attachment=${C} viewer=${D} reason=db_size`),E(413,"Attachment too large");if(!B.tryAcquire())return p.error(`503 attachment=${C} viewer=${D} reason=concurrency`),E(503,"Too many concurrent downloads",mr);let F=!1,R=()=>{F||(F=!0,B.release())},O=!1;try{let X=I.method==="HEAD",W=await L(v.filePath,{maxBytes:K,head:X,principal:i(D)});if(!W.ok){let pe=br(W.reason);return W.reason==="not_found"&&n.markAttachmentMissing(C).catch(De=>{p.error(`markAttachmentMissing failed attachment=${C} message=${De instanceof Error?De.message:"unknown"}`)}),p.error(`${pe} attachment=${C} viewer=${D} reason=${W.reason} code=${W.code??"-"}`),E(pe,gr[pe]??"Attachment storage unavailable")}let j=rt(v.fileType)??rt(W.contentType)??"application/octet-stream",ee=yr.has(j),k=new URL(I.url).searchParams.get("download")==="1",Z=ee?j:"application/octet-stream",ie=ee&&!k?"inline":"attachment",ue=W.size??W.bytes.byteLength,oe=new Headers({"Content-Type":Z,"Content-Length":String(ue),"Content-Disposition":`${ie}; filename="${wt(v.fileName)}"; filename*=UTF-8''${St(v.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return _&&oe.append("Set-Cookie",_),n.markAttachmentPresent(C).catch(pe=>{p.error(`markAttachmentPresent failed attachment=${C} message=${pe instanceof Error?pe.message:"unknown"}`)}),p.info(`200 attachment=${C} viewer=${D} type=${Z} disposition=${ie} bytes=${ue}`),X?new Response(null,{status:200,headers:oe}):(O=!0,new Response(Sr(W.bytes,R,dr),{status:200,headers:oe}))}finally{O||R()}}catch(M){if(M instanceof Response)throw M;return p.error(`500 attachment=? viewer=? reason=unexpected message=${M instanceof Error?M.message:"unknown"}`),E(500,"Attachment request failed")}}}}}var s=require("drizzle-orm");var ge=t=>(0,s.getColumns)(t),te=(t,e)=>{if(!t)return null;let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return typeof t=="string"?t:null;let i=n.getFullYear(),y=i<0?`-${String(-i).padStart(4,"0")}`:String(i).padStart(4,"0"),c=String(n.getMonth()+1).padStart(2,"0"),A=String(n.getDate()).padStart(2,"0");if(e==="YYYY-MM-DD")return`${y}-${c}-${A}`;let h=String(n.getHours()).padStart(2,"0"),N=String(n.getMinutes()).padStart(2,"0"),u=String(n.getSeconds()).padStart(2,"0");return`${y}-${c}-${A} ${h}:${N}:${u}`};function at(t){let{db:e,tables:n,userTable:i,resolveUserId:y,encodeUserId:c,redis:A,cache:h,epochs:N}=t,{hub:u,internal:P,comment:p,label:K,hubLabel:z,userStatus:B}=n,ce=t.externalSources??[],Ae=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Te=Ae[0]??"\u4E0B\u66F8\u304D",re=t.logger??le(1,"[DailyReportService]"),Ce="daily-report:ids",st=t.idsTtlMs??18e4,Re="daily-report:ids:epoch",I="daily-report:business-date:",H=t.businessDateTtlMs??3e5,_="daily-report:date-epoch:",E="daily-report:detail-epoch:",M=t.streamKey??"daily-report:sse-stream",U=t.streamMaxLen??1e4,S=r=>N.incrementEpoch(r),L=r=>tt(u.sourceType,r),Y=(r,a)=>`${Ce}:user:${r}:st:${a}`,C=r=>`${Ce}:user:${r}:`,D=(r,a,o)=>`daily-report:date:${r}:user:${a}:st:${o}`,Q=(r,a)=>`daily-report:date:${r}:user:${a}:`,v=(r,a,o)=>`daily-report:detail:${r}:user:${a}:st:${o}`,F=(r,a)=>`daily-report:detail:${r}:user:${a}:`,R=async(r,a)=>{let o=await A?.getClient();if(!o){re.warn(`[SSE] Redis client unavailable (${a})`);return}let m=Date.now();try{await o.xAdd(M,"*",{data:JSON.stringify(r)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:U}});let b=Date.now()-m;b>1e3&&re.warn(`[SSE] Slow publish (${a}): ${b}ms`)}catch(b){re.error(`[SSE] Redis publish failed (${a}):`,b)}},O=r=>r==null||r===""?null:/^\d+$/.test(r)?c(Number(r)):r,X=()=>{let r={};for(let a of ce)r[`ext_${a.sourceType}`]=ge(a.table);return r},W=r=>{let a=r;for(let o of ce)a=a.leftJoin(o.table,(0,s.and)((0,s.eq)(u.sourceType,o.sourceType),(0,s.eq)(u.sourceIdNum,o.idColumn)));return a},j=(r,a)=>{let{hub:o,internal:m}=r,b=o.summary,f=[],g=null,w=null,x=null,J=null,q=null,G=null,ne=[],ye=ce.find(T=>T.sourceType===o.sourceType),Ie=ye?r[`ext_${ye.sourceType}`]:void 0;if(ye&&Ie){let T=ye.mapRow(Ie);T.content!==void 0&&(b=T.content),T.employeeName!==void 0&&(G=T.employeeName),T.category!==void 0&&(g=T.category),T.creationCategory!==void 0&&(w=T.creationCategory),T.visitTimeFrom!==void 0&&(x=T.visitTimeFrom),T.visitTimeTo!==void 0&&(J=T.visitTimeTo),T.customerName!==void 0&&(q=T.customerName),T.interviewers!==void 0&&(f=T.interviewers),T.comments!==void 0&&(ne=T.comments)}else o.sourceType==="Internal"&&m&&(b=m.body);let he=(r.labels??[]).map(T=>({id:T.id,name:T.name,color:T.color})),fe=r.comments??[],ae=w?Ae.includes(w):!1,V=Se?.[0]??null;return ae&&V&&!he.some(T=>T.id===V)&&he.push({id:V,name:Te,color:null}),{reportHubId:o.id,date:te(o.businessDate,"YYYY-MM-DD"),author:r.creatorName??O(o.createdBy)??"",userId:o.userId?c(o.userId):"",sourceType:o.sourceType??"Internal",createdAt:te(o.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:te(o.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:O(o.updatedBy),employeeName:G??r.creatorName??O(o.createdBy),category:g,creationCategory:w,visitTimeFrom:x,visitTimeTo:J,customerName:q,interviewers:f,subject:o.title,content:b,comments:ne,isRead:r.isRead??!1,isStarred:r.isStarred??!1,labels:he,commentItems:fe.map(T=>({...T,userId:c(T.userId),isMine:a?T.userId===a:!1})),attachments:r.attachments}},ee=async(r,a)=>{let o=(0,s.aliasedTable)(z,"draft_label"),m=await we();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).from(u).leftJoin(o,(0,s.and)((0,s.eq)(o.hubId,u.id),(0,s.inArray)(o.labelId,m))).where((0,s.and)((0,s.isNull)(u.deletedAt),(0,s.or)((0,s.eq)(u.userId,r),(0,s.isNull)(u.userId),(0,s.isNull)(o.hubId)),L(a))).orderBy((0,s.desc)(u.businessDate),(0,s.desc)(u.id))).map(f=>({...f,businessDate:te(f.businessDate,"YYYY-MM-DD")}))},k=async(r,a,o)=>{let m=await oe(r);if(!m)return[];if(be(o))return[];let b=(0,s.aliasedTable)(z,"draft_label"),f=await we();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).top(a).from(u).leftJoin(b,(0,s.and)((0,s.eq)(b.hubId,u.id),(0,s.inArray)(b.labelId,f))).where((0,s.and)((0,s.isNull)(u.deletedAt),(0,s.or)((0,s.eq)(u.userId,m),(0,s.isNull)(u.userId),(0,s.isNull)(b.hubId)),L(o))).orderBy((0,s.desc)(u.businessDate),(0,s.desc)(u.id))).map(w=>({...w,businessDate:te(w.businessDate,"YYYY-MM-DD")}))},Z=async r=>{let a=await W(e.select({hub:ge(u),internal:ge(P),creatorName:i.displayName,...X()}).from(u)).leftJoin(P,(0,s.eq)(u.id,P.hubId)).leftJoin(i,(0,s.eq)(u.userId,i.id)).where((0,s.and)((0,s.eq)(u.businessDate,s.sql`${r}`),(0,s.isNull)(u.deletedAt))).orderBy((0,s.desc)(u.id)),o=await Pe(a.map(m=>m.hub.id));return a.map(m=>j({...m,attachments:o.get(m.hub.id)??[]}))},ie=r=>`${I}${r}`,ue=new Map,oe=async r=>{if(!t.disableUserIdCache&&ue.has(r))return ue.get(r)??null;let a=await y(r);return a!==null&&!t.disableUserIdCache&&ue.set(r,a),a},pe=async(r,{forceRefresh:a=!1,snapshot:o=!1,ttlMsOverride:m}={},b)=>{let f=await oe(r);if(!f)return[];if(be(b))return[];let g=Y(f,ke(b));return h.getOrFetch({cacheKey:g,fetcher:async()=>await ee(f,b),forceRefresh:a,snapshot:o,ttlMsOverride:m??st,epochKey:Re,refreshAheadRatio:.5})},De=(r,{forceRefresh:a=!1,snapshot:o=!1,ttlMsOverride:m}={})=>{let b=se(r);return b?h.getOrFetch({cacheKey:ie(b),fetcher:()=>Z(b),forceRefresh:a,snapshot:o,ttlMsOverride:m??H}):Promise.resolve([])},Se=null,$e=async()=>(Se!==null||(Se=(await e.select({id:K.id}).from(K).where((0,s.inArray)(K.name,Ae)).orderBy(K.id)).map(a=>a.id)),Se),we=async()=>{let r=await $e();return r.length>0?r:[-1]},Fe=async()=>{let r=await $e();if(r.length===0)return null;let[a]=await e.select({id:K.id}).top(1).from(K).where((0,s.eq)(K.name,Te));return a?.id??r[0]},At=(r,a)=>a!=null?"absent":r!=null?"present":"unknown",Pe=async r=>{let a=new Map,o=n.attachment,m=t.attachmentIdCodec;if(r.length===0||!o||!m)return a;let b=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,s.inArray)(o.hubId,r)).orderBy((0,s.asc)(o.createdAt),(0,s.asc)(o.id));for(let f of b){let g={id:m.encode(Number(f.id)),fileName:String(f.fileName),fileType:f.fileType?String(f.fileType):null,fileSize:f.fileSize!=null?Number(f.fileSize):null,createdAt:te(f.createdAt,"YYYY-MM-DD HH:mm:ss"),state:At(f.objectCheckedAt,f.objectMissingAt)},w=a.get(Number(f.hubId));w?w.push(g):a.set(Number(f.hubId),[g])}return a},Tt=async(r,a,o)=>{let m=n.attachment;if(!m||be(o))return null;let b=await we(),f=(0,s.aliasedTable)(z,"draft_label");return(await e.select({fileName:m.fileName,filePath:m.filePath,fileType:m.fileType,fileSize:m.fileSize}).top(1).from(m).innerJoin(u,(0,s.eq)(u.id,m.hubId)).leftJoin(f,(0,s.and)((0,s.eq)(f.hubId,u.id),(0,s.inArray)(f.labelId,b))).where((0,s.and)((0,s.eq)(m.id,r),(0,s.isNull)(u.deletedAt),(0,s.or)((0,s.eq)(u.userId,a),(0,s.isNull)(f.hubId)),L(o))))[0]??null},Ct=async r=>{let a=n.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where((0,s.eq)(a.id,r))}catch(m){re.error("markAttachmentMissing failed",m)}},_t=async r=>{let a=n.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where((0,s.eq)(a.id,r))}catch(m){re.error("markAttachmentPresent failed",m)}},Mt=async(r,a,{forceRefresh:o=!1,snapshot:m=!1,ttlMsOverride:b}={},f)=>{let g=await oe(a);if(!g)return[];let w=se(r);if(!w)return[];if(be(f))return[];let x=D(w,g,ke(f));return h.getOrFetch({cacheKey:x,fetcher:async()=>{let J=await we(),q=(0,s.aliasedTable)(z,"draft_label"),G=await W(e.select({hub:ge(u),internal:ge(P),isRead:B.isRead,isStarred:B.isStarred,creatorName:i.displayName,...X()}).from(u)).leftJoin(P,(0,s.eq)(u.id,P.hubId)).leftJoin(B,(0,s.and)((0,s.eq)(u.id,B.hubId),(0,s.eq)(B.userId,g))).leftJoin(q,(0,s.and)((0,s.eq)(q.hubId,u.id),(0,s.inArray)(q.labelId,J))).leftJoin(i,(0,s.eq)(u.userId,i.id)).where((0,s.and)((0,s.eq)(u.businessDate,s.sql`${w}`),(0,s.isNull)(u.deletedAt),(0,s.or)((0,s.eq)(u.userId,g),(0,s.isNull)(q.hubId)),L(f))).orderBy((0,s.desc)(u.id));if(G.length===0)return[];let ne=G.map(V=>V.hub.id),ye=await e.select({hubId:z.hubId,id:K.id,name:K.name,color:K.color}).from(z).innerJoin(K,(0,s.eq)(z.labelId,K.id)).where((0,s.inArray)(z.hubId,ne)),Ie=await e.select({hubId:p.hubId,id:p.id,body:p.body,createdAt:p.createdAt,userId:p.userId,userName:i.displayName}).from(p).leftJoin(i,(0,s.eq)(p.userId,i.id)).where((0,s.inArray)(p.hubId,ne)).orderBy((0,s.asc)(p.createdAt)),he=await Pe(ne),fe=new Map,ae=new Map;for(let V of ye){let T=fe.get(V.hubId);T||(T=[],fe.set(V.hubId,T)),T.push({id:V.id,name:V.name,color:V.color})}for(let V of Ie){let T=ae.get(V.hubId);T||(T=[],ae.set(V.hubId,T)),T.push({id:V.id,content:V.body,createdAt:te(V.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:V.userId,userName:V.userName||""})}return G.map(V=>{let T=V.hub.id;return j({...V,attachments:he.get(T)??[],labels:fe.get(T)||[],comments:ae.get(T)||[]},g)})},forceRefresh:o,snapshot:m,ttlMsOverride:b??H,epochKey:`${_}${w}`})},_e=async(r,a,{forceRefresh:o=!1,snapshot:m=!1,ttlMsOverride:b}={},f)=>{if(be(f))return null;let g=v(r,a,ke(f));return(await h.getOrFetch({cacheKey:g,fetcher:async()=>{let x=await we(),J=(0,s.aliasedTable)(z,"draft_label"),q=await W(e.select({hub:ge(u),internal:ge(P),isRead:B.isRead,isStarred:B.isStarred,creatorName:i.displayName,...X()}).from(u)).leftJoin(P,(0,s.eq)(u.id,P.hubId)).leftJoin(B,(0,s.and)((0,s.eq)(u.id,B.hubId),(0,s.eq)(B.userId,a))).leftJoin(J,(0,s.and)((0,s.eq)(J.hubId,u.id),(0,s.inArray)(J.labelId,x))).leftJoin(i,(0,s.eq)(u.userId,i.id)).where((0,s.and)((0,s.eq)(u.id,r),(0,s.isNull)(u.deletedAt),(0,s.or)((0,s.eq)(u.userId,a),(0,s.isNull)(J.hubId)),L(f)));if(q.length===0)return[];let G=q[0].hub.id,ne=await e.select({id:K.id,name:K.name,color:K.color}).from(z).innerJoin(K,(0,s.eq)(z.labelId,K.id)).where((0,s.eq)(z.hubId,G)),ye=await e.select({id:p.id,body:p.body,createdAt:p.createdAt,userId:p.userId,userName:i.displayName}).from(p).leftJoin(i,(0,s.eq)(p.userId,i.id)).where((0,s.eq)(p.hubId,G)).orderBy((0,s.asc)(p.createdAt)),Ie=await Pe([G]),he=ne.map(ae=>({id:ae.id,name:ae.name,color:ae.color})),fe=ye.map(ae=>({id:ae.id,content:ae.body,createdAt:te(ae.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:ae.userId,userName:ae.userName||""}));return[j({...q[0],attachments:Ie.get(G)??[],labels:he,comments:fe},a)]},forceRefresh:o,snapshot:m,ttlMsOverride:b??H,epochKey:`${E}${r}`}))[0]??null},Et=async(r,a,o={},m)=>{let b=await oe(a);return b?_e(r,b,o,m):null},vt=async r=>{let[a]=await e.select({sourceType:u.sourceType,deletedAt:u.deletedAt}).top(1).from(u).where((0,s.eq)(u.id,r));return a??null},it=async(r,a)=>{let o=await vt(r);if(!o||o.deletedAt||!me(a,o.sourceType))throw new Error("Not Found")},xt=async(r,a,o,m,b,f)=>{await it(a,f);let g=await e.select().top(1).from(B).where((0,s.and)((0,s.eq)(B.hubId,a),(0,s.eq)(B.userId,r))),w;if(g.length>0?g[0].isStarred!==m?w=(await e.update(B).set({isStarred:m,updatedAt:new Date,updatedBy:String(r)}).output().where((0,s.and)((0,s.eq)(B.hubId,a),(0,s.eq)(B.userId,r))))[0]:w=g[0]:w=(await e.insert(B).output().values({hubId:a,userId:r,isStarred:m,isRead:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let x=se(o);x&&(h.invalidatePrefix(Q(x,r)),await S(`${_}${x}`))}return h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(F(a,r)),await S(`${E}${a}`),await R(Ue.parse({type:"status-update",reportHubId:a,recipientRawUserId:r,statusType:"star",value:m,clientTempId:b}),"setStarStatus"),w},kt=async(r,a,o,m,b,f)=>{await it(a,f);let g=await e.select().top(1).from(B).where((0,s.and)((0,s.eq)(B.hubId,a),(0,s.eq)(B.userId,r))),w;if(g.length>0?g[0].isRead!==m?w=(await e.update(B).set({isRead:m,updatedAt:new Date,updatedBy:String(r)}).output().where((0,s.and)((0,s.eq)(B.hubId,a),(0,s.eq)(B.userId,r))))[0]:w=g[0]:w=(await e.insert(B).output().values({hubId:a,userId:r,isRead:m,isStarred:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let x=se(o);x&&(h.invalidatePrefix(Q(x,r)),await S(`${_}${x}`))}return h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(F(a,r)),await S(`${E}${a}`),await R(Ue.parse({type:"status-update",reportHubId:a,recipientRawUserId:r,statusType:"read",value:m,clientTempId:b}),"setReadStatus"),w},ot=async(r,a)=>{if(a===null)return;let o=await we(),[m]=await e.select({hubId:z.hubId}).top(1).from(z).where((0,s.and)((0,s.eq)(z.hubId,r),(0,s.inArray)(z.labelId,o)));return m?a:void 0},Nt=async(r,a,o,m,b,f)=>{let[g]=await e.select({sourceType:u.sourceType,deletedAt:u.deletedAt,userId:u.userId}).top(1).from(u).where((0,s.eq)(u.id,a));if(!g||g.deletedAt)throw new Error("Not Found");if(!me(f,g.sourceType))throw new Error("Not Found");if(g.sourceType.toLowerCase()!=="internal")throw new Error("Comments are restricted for external daily report sources");let w=await ot(a,g.userId),[x]=await e.insert(p).output().values({hubId:a,userId:r,body:o,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),[J]=await e.select({displayName:i.displayName}).top(1).from(i).where((0,s.eq)(i.id,r)),q=J?.displayName??"Unknown";if(m){let ne=se(m);ne&&(h.invalidatePrefix(`daily-report:date:${ne}:user:`),await S(`${_}${ne}`))}h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(`daily-report:detail:${a}:user:`),await S(`${E}${a}`);let G={id:x.id,userId:c(x.userId),userName:q,content:x.body,createdAt:te(x.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await R(Je.parse({type:"comment-add",reportHubId:a,comment:G,clientTempId:b,recipientRawUserId:w,sourceType:g.sourceType}),"addComment"),G},Lt=async(r,a)=>await r.select().top(1).from(p).where((0,s.eq)(p.id,a)),$t=async(r,a,o,m,b,f)=>{let g=await Lt(e,o);if(g.length===0)throw new Error("Not Found");if(g[0].hubId!==a)throw new Error("Not Found");let[w]=await e.select({userId:u.userId,sourceType:u.sourceType}).top(1).from(u).where((0,s.eq)(u.id,g[0].hubId));if(!(w&&me(f,w.sourceType)))throw new Error("Not Found");if(g[0].userId!==r)throw new Error("Unauthorized");let x=await ot(a,w.userId);if(await e.delete(p).where((0,s.eq)(p.id,o)),m){let J=se(m);J&&(h.invalidatePrefix(`daily-report:date:${J}:user:`),await S(`${_}${J}`))}h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(`daily-report:detail:${a}:user:`),await S(`${E}${a}`),await R(Ge.parse({type:"comment-delete",reportHubId:a,commentId:o,clientTempId:b,recipientRawUserId:x,sourceType:w?.sourceType}),"deleteComment")},Pt=async(r,a,o)=>{re.info("createDailyReport called",{userId:r,businessDate:a});let[m]=await e.select({displayName:i.displayName}).from(i).where((0,s.eq)(i.id,r)),b=m?.displayName??c(r);try{let f=await e.transaction(async x=>{re.info("Starting transaction");let J=`internal-temp-${Date.now()}-${Math.random()}`,[q]=await x.insert(u).output().values({sourceType:"Internal",sourceId:J,businessDate:new Date(a),userId:r,title:"(\u7121\u984C)",createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)});await x.update(u).set({sourceId:String(q.id)}).where((0,s.eq)(u.id,q.id)),re.info("Hub created",q),await x.insert(P).values({hubId:q.id,body:"",createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),re.info("Internal created"),re.info("Calling getDraftLabelId");let G=await Fe();re.info("draftLabelId",G);let ne=[];return G&&(await x.insert(z).values({hubId:q.id,labelId:G,createdAt:new Date,createdBy:String(r)}),ne.push({id:G,name:Te,color:null})),re.info("Label assigned"),{reportHubId:q.id,date:a,createdAt:te(q.createdAt,"YYYY-MM-DD HH:mm:ss"),author:b,userId:c(r),sourceType:"Internal",employeeName:b,updatedBy:c(r),updatedAt:te(q.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:q.title,content:"",comments:[],isRead:!0,isStarred:!1,labels:ne,commentItems:[],attachments:[]}}),g=se(a);g&&h.invalidatePrefix(Q(g,r)),h.invalidatePrefix(I),h.invalidatePrefix(C(r)),await S(Re),g&&await S(`${_}${g}`);let w=await _e(f.reportHubId,r,{forceRefresh:!0},null);if(w){let x=await $e(),J=w.labels.some(q=>x.includes(q.id));await R(Qe.parse({type:"report-create",reportHubId:w.reportHubId,report:w,clientTempId:o,recipientRawUserId:J?r:void 0}),"createDailyReport")}return w??f}catch(f){throw re.error("Error in createDailyReport",f),f}},Be=async(r,a)=>await r.select().top(1).from(u).where((0,s.eq)(u.id,a)),qe=async(r,a,o)=>{await r.update(u).set(o).where((0,s.eq)(u.id,a))},lt=async(r,a,o)=>{await r.update(P).set(o).where((0,s.eq)(P.hubId,a))},ut=async(r,a,o)=>{await r.delete(z).where((0,s.and)((0,s.eq)(z.hubId,a),(0,s.eq)(z.labelId,o)))};return{streamKey:M,streamMaxLen:U,clearCache:async()=>{h.clearAll(),ue.clear(),Se=null,N&&await S(Re),re.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(r,a)=>{h.invalidatePrefix(I);for(let o of new Set(r))h.invalidatePrefix(`daily-report:detail:${o}:user:`),await S(`${E}${o}`);for(let o of new Set(a)){let m=se(o);m&&await S(`${_}${m}`)}},getUserIdByExternalId:oe,getDailyReportIdsByExternalId:pe,getDailyReportIdsFirstPageByExternalId:k,getDailyReportsByBusinessDate:De,getDailyReportsByBusinessDateByExternalId:Mt,getDailyReportDetailById:_e,getDailyReportDetailByIdByExternalId:Et,getDraftLabelId:Fe,getAttachmentsByHubIds:Pe,getAttachmentForUser:Tt,markAttachmentMissing:Ct,markAttachmentPresent:_t,setStarStatus:xt,setReadStatus:kt,addComment:Nt,deleteComment:$t,createDailyReport:Pt,updateDailyReport:async(r,a,o,m)=>{let b=await Be(e,r);if(!b.length||b[0].deletedAt)throw new Error("Not Found");if(b[0].userId!==a)throw new Error("Unauthorized");await e.transaction(async w=>{o.title!==void 0&&await qe(w,r,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await lt(w,r,{body:o.content,updatedAt:new Date,updatedBy:String(a)})}),h.invalidate(`daily-report:detail:${r}`),h.invalidatePrefix(`daily-report:detail:${r}:user:`),h.invalidatePrefix(I),await S(`${E}${r}`);let f=se(te(b[0].businessDate,"YYYY-MM-DD"));f&&(h.invalidatePrefix(`daily-report:date:${f}:user:`),await S(`${_}${f}`));let g=await _e(r,a,{forceRefresh:!0},null);if(g){let w=await $e(),x=g.labels.some(J=>w.includes(J.id));await R(Xe.parse({type:"report-update",reportHubId:g.reportHubId,report:g,clientTempId:m,recipientRawUserId:x?a:void 0}),"updateDailyReport")}},publishDailyReport:async(r,a,o)=>{let m=await Be(e,r);if(!m.length)throw new Error("Not Found");if(m[0].userId!==a)throw new Error("Unauthorized");let b=await Fe();if(!b)return null;if(await ut(e,r,b),h.invalidatePrefix(`daily-report:detail:${r}:user:`),h.invalidatePrefix(I),h.invalidatePrefix(Ce),await S(Re),m[0].businessDate){let w=se(te(m[0].businessDate,"YYYY-MM-DD"));w&&await S(`${_}${w}`)}let f=se(te(m[0].businessDate,"YYYY-MM-DD"));f&&h.invalidatePrefix(Q(f,a));let g=await _e(r,a,{forceRefresh:!0},null);return g&&await R(We.parse({type:"report-publish",reportHubId:g.reportHubId,report:g,clientTempId:o}),"publishDailyReport"),g??null},deleteDailyReport:async(r,a,o)=>{let m=await Be(e,r);if(!m.length||m[0].deletedAt)throw new Error("Not Found");if(m[0].userId!==a)throw new Error("Unauthorized");if(await qe(e,r,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),h.invalidatePrefix(`daily-report:detail:${r}:user:`),h.invalidatePrefix(I),h.invalidatePrefix(Ce),await S(Re),m[0].businessDate){let b=se(te(m[0].businessDate,"YYYY-MM-DD"));b&&await S(`${_}${b}`)}await R(Ze.parse({type:"report-delete",reportHubId:r,clientTempId:o,sourceType:m[0].sourceType}),"deleteDailyReport")},findDailyReportHubById:Be,updateDailyReportHub:qe,updateDailyReportInternal:lt,deleteDailyReportLabel:ut}}var Ne=require("drizzle-orm");function It(t){let e=[],n=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 n){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 Ir(t,e,n){let i=t,y=e.TMResource,c=n.appKey,A=n.actor??"system:daily-report",h=new Date,N=n.resources??It(n.sources);for(let u of N){let P=await i.select().from(y).where((0,Ne.and)((0,Ne.eq)(y.appKey,c),(0,Ne.eq)(y.resourceKey,u.resourceKey)));(!P||P.length===0)&&await i.insert(y).values({appKey:c,resourceKey:u.resourceKey,name:u.name,description:u.description??null,createdAt:h,createdBy:A,updatedAt:h,updatedBy:A})}}var Ar=le(1,"[DailyReportExternalSource]"),Tr=(t,e,n,i=Ar)=>{if(!t)return[];try{let y=JSON.parse(t);return Array.isArray(y)?y.map(n).filter(c=>c!==null):(i.warn(`Unexpected ${e} format: not an array`),[])}catch(y){return i.warn(`Failed to parse ${e}:`,y),[]}};var Le=require("drizzle-orm"),l=require("drizzle-orm/mssql-core");function Cr(t,e){let n=(0,l.mssqlSchema)(t),i=e.userTable,y=n.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(Le.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})},p=>[(0,l.primaryKey)({name:`${t}_DailyReportHub_pk`,columns:[p.id]}),(0,l.foreignKey)({name:`${t}_DailyReportHub_user_id_fk`,columns:[p.userId],foreignColumns:[i.id]}),(0,l.index)(`${t}_DailyReportHub_business_date_index`).on(p.businessDate),(0,l.index)(`${t}_DailyReportHub_updated_at_index`).on(p.updatedAt),(0,l.index)(`${t}_DailyReportHub_source_index`).on(p.sourceType,p.sourceId),(0,l.index)(`${t}_DailyReportHub_user_id_index`).on(p.userId),(0,l.index)(`${t}_DailyReportHub_business_date_id_index`).on((0,Le.desc)(p.businessDate),(0,Le.desc)(p.id)),(0,l.index)(`${t}_DailyReportHub_deleted_at_index`).on(p.deletedAt)]),c=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportInternal_pk`,columns:[p.hubId]}),(0,l.foreignKey)({name:`${t}_DailyReportInternal_hub_id_fk`,columns:[p.hubId],foreignColumns:[y.id]})]),A=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportComment_pk`,columns:[p.id]}),(0,l.foreignKey)({name:`${t}_DailyReportComment_hub_id_fk`,columns:[p.hubId],foreignColumns:[y.id]}),(0,l.foreignKey)({name:`${t}_DailyReportComment_user_id_fk`,columns:[p.userId],foreignColumns:[i.id]}),(0,l.index)(`${t}_DailyReportComment_hub_id_index`).on(p.hubId)]),h=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportLabel_pk`,columns:[p.id]}),(0,l.foreignKey)({name:`${t}_DailyReportLabel_user_id_fk`,columns:[p.userId],foreignColumns:[i.id]})]),N=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportHub_Label_pk`,columns:[p.hubId,p.labelId]}),(0,l.foreignKey)({name:`${t}_DailyReportHub_Label_hub_id_fk`,columns:[p.hubId],foreignColumns:[y.id]}),(0,l.foreignKey)({name:`${t}_DailyReportHub_Label_label_id_fk`,columns:[p.labelId],foreignColumns:[h.id]})]),u=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportUserStatus_pk`,columns:[p.hubId,p.userId]}),(0,l.foreignKey)({name:`${t}_DailyReportUserStatus_hub_id_fk`,columns:[p.hubId],foreignColumns:[y.id]}),(0,l.foreignKey)({name:`${t}_DailyReportUserStatus_user_id_fk`,columns:[p.userId],foreignColumns:[i.id]})]),P=n.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()},p=>[(0,l.primaryKey)({name:`${t}_DailyReportAttachment_pk`,columns:[p.id]}),(0,l.foreignKey)({name:`${t}_DailyReportAttachment_hub_id_fk`,columns:[p.hubId],foreignColumns:[y.id]}),(0,l.foreignKey)({name:`${t}_DailyReportAttachment_uploaded_by_fk`,columns:[p.uploadedBy],foreignColumns:[i.id]}),(0,l.uniqueIndex)(`${t}_DailyReportAttachment_source_unique`).on(p.hubId,p.sourceKey),(0,l.index)(`${t}_DailyReportAttachment_hub_id_index`).on(p.hubId,p.createdAt)]);return{hub:y,internal:c,comment:A,attachment:P,label:h,hubLabel:N,userStatus:u}}function _r(t){let e=Ke(t.redis),n=new Me({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),i=at({...t,cache:n,epochs:e}),y=new Ee({redis:t.redis,streamKey:i.streamKey,cache:n,logger:t.logger}),c=nt({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:y,streamKey:i.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:i,cache:n,epochs:e,sseReader:y,streamKey:i.streamKey,knownSourceTypes:[...new Set(["Internal",...(t.externalSources??[]).map(A=>A.sourceType)])],...c}}0&&(module.exports={DailyReportSseReader,SqlResultCache,asciiFallbackFileName,buildVisibleSourceTypeCondition,computeSourceTypeDigest,createDailyReportHandlers,createDailyReportServer,createDailyReportService,createEpochStore,defineDailyReportAuthzResources,defineDailyReportSchema,deniesEverySourceType,encodeRfc8187,formatDateValue,generateETag,isSourceTypeVisible,isStreamIdLte,jsonResponseWithETag,normalizeVisibleSourceTypes,sanitizeMediaType,seedDailyReportAuthzResources,transformJsonArray});
|
|
13
16
|
//# sourceMappingURL=server.js.map
|