@aiquants/daily-report 0.9.1 → 0.10.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/dist/server.d.mts CHANGED
@@ -168,6 +168,14 @@ type SqlResultCacheQueryOptions = {
168
168
  snapshot?: boolean;
169
169
  ttlMsOverride?: number;
170
170
  epochKey?: string;
171
+ /**
172
+ * ヒット時にバケット年齢が ttl × ratio を超えていたら、キャッシュ値を即返しつつ
173
+ * 裏で 1 本だけ再フェッチして置き換える (未指定は従来動作 = 何もしない)。
174
+ * 有効域は 0 <= ratio < 1: ヒット判定が「未失効」を要求するため年齢は常に ttl 未満であり、
175
+ * ratio 1 は事実上発火しない。ratio 0 は毎ヒット裏更新 (undefined とは区別される)。
176
+ * 定期的にアクセスされるキーの「TTL 切れ直後のコールド遭遇」を対話リクエストから排除する。
177
+ */
178
+ refreshAheadRatio?: number;
171
179
  };
172
180
  /**
173
181
  * Creates epoch helpers bound to an optional redis provider.
@@ -203,6 +211,18 @@ declare class SqlResultCache {
203
211
  * 指定されたキャッシュバケットを無効化します。
204
212
  */
205
213
  invalidate: (cacheKey: string) => void;
214
+ /**
215
+ * Kicks a single background refetch when the bucket has aged past ttl * ratio.
216
+ * バケット年齢が ttl × ratio を超えたヒット時に、裏で 1 本だけ再フェッチを起動する処理。
217
+ *
218
+ * 応答は誰も待たない。完了までは旧バケットがそのまま生きているため、並行するヒットは
219
+ * 従来どおりキャッシュから即答する (バケットを先に消す forceRefresh 委譲はスタンピードに
220
+ * なるため使わない)。バケットが有効な間は失敗しても旧バケットが残るだけ (safe 方向)。
221
+ * 裏フェッチ中に TTL が完全に切れて in-flight へ相乗りした前面リクエストには、通常の
222
+ * in-flight 共有と同じく失敗が伝播する (相乗りしなくても自前フェッチが同様に失敗する状況)。
223
+ * in-flight が既に居れば起動しない (前面リクエストの結果で足りる)。
224
+ */
225
+ private maybeRefreshAhead;
206
226
  /**
207
227
  * Retrieves records from cache or fetches them if expired/missing.
208
228
  * キャッシュからレコードを取得するか、期限切れや未存在の場合はフェッチします。
@@ -1606,6 +1626,22 @@ type DailyReportService = ReturnType<typeof createDailyReportService>;
1606
1626
  * Creates the daily-report data-access service bound to the injected dependencies.
1607
1627
  * 注入された依存に束縛された日報データアクセスサービスを生成する処理。
1608
1628
  */
1629
+ type DatePattern = "YYYY-MM-DD HH:mm:ss" | "YYYY-MM-DD";
1630
+ /**
1631
+ * Formats date-like values to a given pattern using local-time fields (no Intl allocation).
1632
+ * 日付相当の値をローカル時刻フィールドで指定パターンへ整形する処理 (Intl 非生成)。
1633
+ *
1634
+ * ローカル時刻フィールドの手組み整形。旧実装 (ja-JP ロケール + 2-digit toLocale*) と出力互換。
1635
+ * ❗ toLocale* 系へ戻さないこと: あれは呼び出しごとに Intl.DateTimeFormat を生成し
1636
+ * (実測 約 66μs/呼)、全量 ids の 227k 行 map で 15〜20 秒の同期 CPU 洪水になる。
1637
+ * business-date / SSE の全応答が人質化した実害バグの根本原因だった。
1638
+ * モジュールスコープの export であり、バレル (src/server.ts の `export *`) 経由で
1639
+ * `@aiquants/daily-report/server` の公開 API の一部になる (テストからの直接検証と
1640
+ * ホスト側での汎用日時整形の再利用を意図した、意図的な公開)。
1641
+ * 1000 年未満の年は旧実装 (年ゼロ詰めなし) から意図的に乖離し、ISO 準拠の 4 桁ゼロ詰めで出す
1642
+ * (負の年は符号を除いた絶対値を 4 桁詰め。DB の date/datetime からは到達しない文字列入力のみの領域)。
1643
+ */
1644
+ declare const formatDateValue: (value: Date | string | null | undefined, pattern: DatePattern) => string | null;
1609
1645
  declare function createDailyReportService(config: DailyReportServiceConfig): {
1610
1646
  streamKey: string;
1611
1647
  streamMaxLen: number;
@@ -1716,6 +1752,12 @@ declare class DailyReportSseReader {
1716
1752
  * クライアントを閉じて xRead ループを停止する。
1717
1753
  */
1718
1754
  private _stopLoop;
1755
+ /**
1756
+ * Emits an "error" event only when a listener exists (bare "error" emit throws).
1757
+ * リスナーが居るときだけ "error" イベントを emit する処理 (リスナー 0 の "error" emit は
1758
+ * EventEmitter 仕様で throw し、非同期文脈では unhandled rejection = プロセス危険になるため)。
1759
+ */
1760
+ private _emitError;
1719
1761
  }
1720
1762
 
1721
1763
  type AuthzResourceItem = {
@@ -1997,4 +2039,4 @@ declare function createDailyReportServer(config: DailyReportServerConfig): {
1997
2039
  streamKey: string;
1998
2040
  };
1999
2041
 
2000
- export { type AuthzResourceItem, type DailyReportAttachmentBytes, type DailyReportAttachmentError, type DailyReportAttachmentFailure, type DailyReportAttachmentTable, type DailyReportAuthResult, type DailyReportAuthenticate, type DailyReportCommentRow, type DailyReportCommentTable, type DailyReportDb, type DailyReportEncodeUserId, type DailyReportExternalSource, type DailyReportHandlersConfig, type DailyReportHubLabelTable, type DailyReportHubRow, type DailyReportHubTable, type DailyReportIdCodec, type DailyReportInternalRow, type DailyReportInternalTable, type DailyReportLabelTable, type DailyReportReadAttachment, type DailyReportRedisBlockingClient, type DailyReportRedisClient, type DailyReportRedisProvider, type DailyReportResolveUserId, type DailyReportServerConfig, type DailyReportService, type DailyReportServiceConfig, type DailyReportSourceTypeInput, DailyReportSseReader, type DailyReportSseReaderConfig, type DailyReportTables, type DailyReportUserStatusRow, type DailyReportUserStatusTable, type DailyReportUserTable, type EpochStore, type ExternalReportFields, type RedisStreamMessage, SqlResultCache, type SqlResultCacheQueryOptions, type StreamEntry, asciiFallbackFileName, createDailyReportHandlers, createDailyReportServer, createDailyReportService, createEpochStore, defineDailyReportAuthzResources, defineDailyReportSchema, encodeRfc8187, generateETag, isStreamIdLte, jsonResponseWithETag, sanitizeMediaType, seedDailyReportAuthzResources, transformJsonArray };
2042
+ export { type AuthzResourceItem, type DailyReportAttachmentBytes, type DailyReportAttachmentError, type DailyReportAttachmentFailure, type DailyReportAttachmentTable, type DailyReportAuthResult, type DailyReportAuthenticate, type DailyReportCommentRow, type DailyReportCommentTable, type DailyReportDb, type DailyReportEncodeUserId, type DailyReportExternalSource, type DailyReportHandlersConfig, type DailyReportHubLabelTable, type DailyReportHubRow, type DailyReportHubTable, type DailyReportIdCodec, type DailyReportInternalRow, type DailyReportInternalTable, type DailyReportLabelTable, type DailyReportReadAttachment, type DailyReportRedisBlockingClient, type DailyReportRedisClient, type DailyReportRedisProvider, type DailyReportResolveUserId, type DailyReportServerConfig, type DailyReportService, type DailyReportServiceConfig, type DailyReportSourceTypeInput, DailyReportSseReader, type DailyReportSseReaderConfig, type DailyReportTables, type DailyReportUserStatusRow, type DailyReportUserStatusTable, type DailyReportUserTable, type EpochStore, type ExternalReportFields, type RedisStreamMessage, SqlResultCache, type SqlResultCacheQueryOptions, type StreamEntry, asciiFallbackFileName, createDailyReportHandlers, createDailyReportServer, createDailyReportService, createEpochStore, defineDailyReportAuthzResources, defineDailyReportSchema, encodeRfc8187, formatDateValue, generateETag, isStreamIdLte, jsonResponseWithETag, sanitizeMediaType, seedDailyReportAuthzResources, transformJsonArray };
package/dist/server.d.ts CHANGED
@@ -168,6 +168,14 @@ type SqlResultCacheQueryOptions = {
168
168
  snapshot?: boolean;
169
169
  ttlMsOverride?: number;
170
170
  epochKey?: string;
171
+ /**
172
+ * ヒット時にバケット年齢が ttl × ratio を超えていたら、キャッシュ値を即返しつつ
173
+ * 裏で 1 本だけ再フェッチして置き換える (未指定は従来動作 = 何もしない)。
174
+ * 有効域は 0 <= ratio < 1: ヒット判定が「未失効」を要求するため年齢は常に ttl 未満であり、
175
+ * ratio 1 は事実上発火しない。ratio 0 は毎ヒット裏更新 (undefined とは区別される)。
176
+ * 定期的にアクセスされるキーの「TTL 切れ直後のコールド遭遇」を対話リクエストから排除する。
177
+ */
178
+ refreshAheadRatio?: number;
171
179
  };
172
180
  /**
173
181
  * Creates epoch helpers bound to an optional redis provider.
@@ -203,6 +211,18 @@ declare class SqlResultCache {
203
211
  * 指定されたキャッシュバケットを無効化します。
204
212
  */
205
213
  invalidate: (cacheKey: string) => void;
214
+ /**
215
+ * Kicks a single background refetch when the bucket has aged past ttl * ratio.
216
+ * バケット年齢が ttl × ratio を超えたヒット時に、裏で 1 本だけ再フェッチを起動する処理。
217
+ *
218
+ * 応答は誰も待たない。完了までは旧バケットがそのまま生きているため、並行するヒットは
219
+ * 従来どおりキャッシュから即答する (バケットを先に消す forceRefresh 委譲はスタンピードに
220
+ * なるため使わない)。バケットが有効な間は失敗しても旧バケットが残るだけ (safe 方向)。
221
+ * 裏フェッチ中に TTL が完全に切れて in-flight へ相乗りした前面リクエストには、通常の
222
+ * in-flight 共有と同じく失敗が伝播する (相乗りしなくても自前フェッチが同様に失敗する状況)。
223
+ * in-flight が既に居れば起動しない (前面リクエストの結果で足りる)。
224
+ */
225
+ private maybeRefreshAhead;
206
226
  /**
207
227
  * Retrieves records from cache or fetches them if expired/missing.
208
228
  * キャッシュからレコードを取得するか、期限切れや未存在の場合はフェッチします。
@@ -1606,6 +1626,22 @@ type DailyReportService = ReturnType<typeof createDailyReportService>;
1606
1626
  * Creates the daily-report data-access service bound to the injected dependencies.
1607
1627
  * 注入された依存に束縛された日報データアクセスサービスを生成する処理。
1608
1628
  */
1629
+ type DatePattern = "YYYY-MM-DD HH:mm:ss" | "YYYY-MM-DD";
1630
+ /**
1631
+ * Formats date-like values to a given pattern using local-time fields (no Intl allocation).
1632
+ * 日付相当の値をローカル時刻フィールドで指定パターンへ整形する処理 (Intl 非生成)。
1633
+ *
1634
+ * ローカル時刻フィールドの手組み整形。旧実装 (ja-JP ロケール + 2-digit toLocale*) と出力互換。
1635
+ * ❗ toLocale* 系へ戻さないこと: あれは呼び出しごとに Intl.DateTimeFormat を生成し
1636
+ * (実測 約 66μs/呼)、全量 ids の 227k 行 map で 15〜20 秒の同期 CPU 洪水になる。
1637
+ * business-date / SSE の全応答が人質化した実害バグの根本原因だった。
1638
+ * モジュールスコープの export であり、バレル (src/server.ts の `export *`) 経由で
1639
+ * `@aiquants/daily-report/server` の公開 API の一部になる (テストからの直接検証と
1640
+ * ホスト側での汎用日時整形の再利用を意図した、意図的な公開)。
1641
+ * 1000 年未満の年は旧実装 (年ゼロ詰めなし) から意図的に乖離し、ISO 準拠の 4 桁ゼロ詰めで出す
1642
+ * (負の年は符号を除いた絶対値を 4 桁詰め。DB の date/datetime からは到達しない文字列入力のみの領域)。
1643
+ */
1644
+ declare const formatDateValue: (value: Date | string | null | undefined, pattern: DatePattern) => string | null;
1609
1645
  declare function createDailyReportService(config: DailyReportServiceConfig): {
1610
1646
  streamKey: string;
1611
1647
  streamMaxLen: number;
@@ -1716,6 +1752,12 @@ declare class DailyReportSseReader {
1716
1752
  * クライアントを閉じて xRead ループを停止する。
1717
1753
  */
1718
1754
  private _stopLoop;
1755
+ /**
1756
+ * Emits an "error" event only when a listener exists (bare "error" emit throws).
1757
+ * リスナーが居るときだけ "error" イベントを emit する処理 (リスナー 0 の "error" emit は
1758
+ * EventEmitter 仕様で throw し、非同期文脈では unhandled rejection = プロセス危険になるため)。
1759
+ */
1760
+ private _emitError;
1719
1761
  }
1720
1762
 
1721
1763
  type AuthzResourceItem = {
@@ -1997,4 +2039,4 @@ declare function createDailyReportServer(config: DailyReportServerConfig): {
1997
2039
  streamKey: string;
1998
2040
  };
1999
2041
 
2000
- export { type AuthzResourceItem, type DailyReportAttachmentBytes, type DailyReportAttachmentError, type DailyReportAttachmentFailure, type DailyReportAttachmentTable, type DailyReportAuthResult, type DailyReportAuthenticate, type DailyReportCommentRow, type DailyReportCommentTable, type DailyReportDb, type DailyReportEncodeUserId, type DailyReportExternalSource, type DailyReportHandlersConfig, type DailyReportHubLabelTable, type DailyReportHubRow, type DailyReportHubTable, type DailyReportIdCodec, type DailyReportInternalRow, type DailyReportInternalTable, type DailyReportLabelTable, type DailyReportReadAttachment, type DailyReportRedisBlockingClient, type DailyReportRedisClient, type DailyReportRedisProvider, type DailyReportResolveUserId, type DailyReportServerConfig, type DailyReportService, type DailyReportServiceConfig, type DailyReportSourceTypeInput, DailyReportSseReader, type DailyReportSseReaderConfig, type DailyReportTables, type DailyReportUserStatusRow, type DailyReportUserStatusTable, type DailyReportUserTable, type EpochStore, type ExternalReportFields, type RedisStreamMessage, SqlResultCache, type SqlResultCacheQueryOptions, type StreamEntry, asciiFallbackFileName, createDailyReportHandlers, createDailyReportServer, createDailyReportService, createEpochStore, defineDailyReportAuthzResources, defineDailyReportSchema, encodeRfc8187, generateETag, isStreamIdLte, jsonResponseWithETag, sanitizeMediaType, seedDailyReportAuthzResources, transformJsonArray };
2042
+ export { type AuthzResourceItem, type DailyReportAttachmentBytes, type DailyReportAttachmentError, type DailyReportAttachmentFailure, type DailyReportAttachmentTable, type DailyReportAuthResult, type DailyReportAuthenticate, type DailyReportCommentRow, type DailyReportCommentTable, type DailyReportDb, type DailyReportEncodeUserId, type DailyReportExternalSource, type DailyReportHandlersConfig, type DailyReportHubLabelTable, type DailyReportHubRow, type DailyReportHubTable, type DailyReportIdCodec, type DailyReportInternalRow, type DailyReportInternalTable, type DailyReportLabelTable, type DailyReportReadAttachment, type DailyReportRedisBlockingClient, type DailyReportRedisClient, type DailyReportRedisProvider, type DailyReportResolveUserId, type DailyReportServerConfig, type DailyReportService, type DailyReportServiceConfig, type DailyReportSourceTypeInput, DailyReportSseReader, type DailyReportSseReaderConfig, type DailyReportTables, type DailyReportUserStatusRow, type DailyReportUserStatusTable, type DailyReportUserTable, type EpochStore, type ExternalReportFields, type RedisStreamMessage, SqlResultCache, type SqlResultCacheQueryOptions, type StreamEntry, asciiFallbackFileName, createDailyReportHandlers, createDailyReportServer, createDailyReportService, createEpochStore, defineDailyReportAuthzResources, defineDailyReportSchema, encodeRfc8187, formatDateValue, generateETag, isStreamIdLte, jsonResponseWithETag, sanitizeMediaType, seedDailyReportAuthzResources, transformJsonArray };
package/dist/server.js CHANGED
@@ -1,13 +1,13 @@
1
- "use strict";var Le=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var It=Object.getOwnPropertyNames;var St=Object.prototype.hasOwnProperty;var At=(t,e)=>{for(var s in e)Le(t,s,{get:e[s],enumerable:!0})},Ct=(t,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let y of It(e))!St.call(t,y)&&y!==s&&Le(t,y,{get:()=>e[y],enumerable:!(i=wt(e,y))||i.enumerable});return t};var _t=t=>Ct(Le({},"__esModule",{value:!0}),t);var or={};At(or,{DailyReportSseReader:()=>De,SqlResultCache:()=>Re,asciiFallbackFileName:()=>it,createDailyReportHandlers:()=>ze,createDailyReportServer:()=>sr,createDailyReportService:()=>Ke,createEpochStore:()=>$e,defineDailyReportAuthzResources:()=>lt,defineDailyReportSchema:()=>ar,encodeRfc8187:()=>ot,generateETag:()=>Ee,isStreamIdLte:()=>we,jsonResponseWithETag:()=>ae,sanitizeMediaType:()=>Fe,seedDailyReportAuthzResources:()=>tr,transformJsonArray:()=>nr});module.exports=_t(or);var $e=t=>({async getEpoch(e){try{let s=await t?.getClient();if(!s)return 0;let i=await s.get(e);return i?Number(i):0}catch{return 0}},async incrementEpoch(e){try{let s=await t?.getClient();if(!s)return;await s.incr(e)}catch{}}}),Re=class{constructor(e,s){this.config=e;this.epochStore=s;this.buckets=new Map;this.inFlight=new Map;this.invalidate=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.getOrFetch=async e=>{let{cacheKey:s,forceRefresh:i,snapshot:y}=e,m=this.buckets.get(s);if(i&&(this.buckets.delete(s),this.inFlight.delete(s)),!i&&m&&m.expireAt>Date.now())if(e.epochKey){let h=await this.epochStore.getEpoch(e.epochKey);if(m.epoch===h)return y?m.records.map(O=>structuredClone(O)):m.records;this.buckets.delete(s)}else return y?m.records.map(h=>structuredClone(h)):m.records;if(!i&&this.inFlight.has(s)){let h=await this.inFlight.get(s);return y?h.map(O=>structuredClone(O)):h}let M;M=(async()=>{let h=await e.fetcher();if(i||this.inFlight.get(s)===M){let O=Date.now()+(e.ttlMsOverride??this.config.defaultTtlMs),u=e.epochKey?await this.epochStore.getEpoch(e.epochKey):0;this.buckets.set(s,{records:h,expireAt:O,epoch:u}),this.buckets.size>500&&this.cleanExpired()}return h})(),i||this.inFlight.set(s,M);try{let h=await M;return y?h.map(O=>structuredClone(O)):h}finally{this.inFlight.delete(s)}};this.flush=e=>{this.buckets.delete(e),this.inFlight.delete(e)};this.clearAll=()=>{this.buckets.clear(),this.inFlight.clear()};this.invalidatePrefix=e=>{for(let s of this.buckets.keys())s.startsWith(e)&&this.buckets.delete(s);for(let s of this.inFlight.keys())s.startsWith(e)&&this.inFlight.delete(s)}}cleanExpired(){let e=Date.now();for(let[s,i]of this.buckets.entries())i.expireAt<=e&&this.buckets.delete(s)}};var Tt=/^\d{4}-\d{2}-\d{2}$/,Mt=/^\d{4}\/\d{2}\/\d{2}$/,Qe=t=>t<10?`0${t}`:`${t}`,Xe=t=>{if(Number.isNaN(t.getTime()))return null;let e=t.getFullYear(),s=Qe(t.getMonth()+1),i=Qe(t.getDate());return`${e}-${s}-${i}`};var ee=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 s=new Date(e);return Xe(s)};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 s=t.findIndex(i=>Et({businessDate:i.businessDate,reportHubId:i.reportHubId},e)>0);return s===-1?t.length:s};var ne=(t,e,s=console)=>{let i=y=>typeof y=="string"?[`${e} ${y}`]:[e,y];return{debug:(y,...m)=>{t<=0&&s.debug(...i(y),...m)},info:(y,...m)=>{t<=1&&s.info(...i(y),...m)},warn:(y,...m)=>{t<=2&&s.warn(...i(y),...m)},error:(y,...m)=>{t<=3&&s.error(...i(y),...m)}}};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([])}),Lt=d.z.object({type:d.z.literal("connected")}),Me=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",[Lt,Me,Be,Ue,He,Ye,Oe,qe]);var et=require("crypto"),Ee=t=>{let e=JSON.stringify(t);return`"${(0,et.createHash)("sha256").update(e).digest("hex")}"`};var $t=ne(1,"[Response]"),ae=(t,e,s,i=200,y=$t)=>{let m=Ee(s),M=t.headers.get("If-None-Match");y.info(`[jsonResponseWithETag] ETag: ${m}, If-None-Match: ${M}`);let h=new Headers({"Content-Type":"application/json","Cache-Control":"private, max-age=0, must-revalidate","X-Content-Type-Options":"nosniff","X-Frame-Options":"DENY","Content-Security-Policy":"default-src 'none'",ETag:m});return e&&h.append("Set-Cookie",e),t.method==="GET"&&i===200&&M===m?new Response(null,{status:304,headers:h}):new Response(JSON.stringify(s),{status:i,headers:h})};var tt=require("events");var we=(t,e)=>{let[s,i]=t.split("-").map(Number),[y,m]=e.split("-").map(Number);return s!==y?s<y:i<=m},De=class{constructor(e){this.config=e;this._emitter=new tt.EventEmitter;this._state="idle";this._refCount=0;this._lastId="0-0";this._emitter.setMaxListeners(0),this._logger=e.logger??ne(1,"[SSE Reader]")}subscribe(e,s){return this._emitter.on("entry",e),s&&this._emitter.on("error",s),this._refCount++,this._refCount===1&&this._startLoop(),()=>{this._emitter.removeListener("entry",e),s&&this._emitter.removeListener("error",s),this._refCount--,this._refCount<=0&&(this._refCount=0,this._stopLoop())}}async destroy(){this._refCount=0,await this._stopLoop(),this._emitter.removeAllListeners(),this._lastId="0-0"}async _startLoop(){for(;this._state==="stopping";)await new Promise(e=>setTimeout(e,50));if(this._state!=="running"){this._state="running";try{this._client=await this.config.redis?.createClient()}catch(e){this._state="idle",this._emitter.emit("error",e instanceof Error?e:new Error("Failed to create Redis client for SSE reader"));return}if(!this._client){this._state="idle",this._emitter.emit("error",new Error("Failed to create Redis client for SSE reader"));return}this._client.on("error",e=>{this._logger.error("Redis client error:",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 s of e)for(let i of s.messages){this._lastId=i.id;try{let y=i.message?.data?JSON.parse(i.message.data):null,m=y?.type;if((m==="report-create"||m==="report-delete"||m==="report-publish")&&this.config.cache.invalidatePrefix("daily-report:ids"),m==="comment-add"||m==="comment-delete"||m==="status-update"){let M=y?.reportHubId;typeof M=="number"&&(this.config.cache.invalidate(`daily-report:detail:${M}`),this.config.cache.invalidatePrefix(`daily-report:detail:${M}: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._emitter.emit("error",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!=="idle";)await new Promise(e=>setTimeout(e,50))}}};var L=(t,e)=>new Response(JSON.stringify(t),{status:e?.status??200,headers:{"Content-Type":"application/json"}}),ve=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"),s=t.searchParams.get("cursor_business_date");if(e===null)return s===null?{cursor:null}:{invalid:!0};let i=Number.parseInt(e,10);return!Number.isSafeInteger(i)||String(i)!==e||i<=0?{invalid:!0}:s===null?{cursor:{businessDate:null,reportHubId:i}}:Bt.test(s)?{cursor:{businessDate:s,reportHubId:i}}:{invalid:!0}};async function*nt(t,e,s=ve){let i=e?We(t,e):0,y=!0;for(;;){let m=t.slice(i,i+(y?s:st));i+=m.length;let M=i>=t.length,h=m[m.length-1];if(yield{items:m,nextCursor:M||!h?null:{businessDate:h.businessDate,reportHubId:h.reportHubId},isLast:M,...y?{total:t.length}:{}},y=!1,M)return}}var at=(t,e,s,i)=>{let y=new TextEncoder,m=!1,M=null,h=new ReadableStream({async pull(u){if(m||s.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}let N=null;try{M===null&&(M=e.next());let p=new Promise(me=>{N=setTimeout(()=>me(rt),Ut)}),K=await Promise.race([M,p]);if(N!==null&&(clearTimeout(N),N=null),K===rt){if(m||s.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(y.encode(`
2
- `));return}M=null;let{value:q,done:U}=K;if(U){u.close();return}if(m||s.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(y.encode(`${JSON.stringify(q)}
3
- `))}catch(p){if(N!==null&&clearTimeout(N),M=null,m||s.signal.aborted)return;i.error(`ids-stream emission failed: ${p instanceof Error?p.message:String(p)}`);try{u.enqueue(y.encode(`${JSON.stringify({error:Pt})}
4
- `)),u.close()}catch{}}},cancel(){m=!0,e.return(void 0).catch(()=>{})}}),O=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&O.append("Set-Cookie",t),new Response(h,{status:200,headers:O})},Yt=32*1024*1024,Ot=60,qt=4,Ft=12e4,zt=1024,Kt=60,Jt=5,jt=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),Gt=/^[\x20-\x7E]+$/,Qt=/^[\w.+-]+\/[\w.+-]+/,Fe=t=>t&&Gt.test(t)&&Qt.test(t)?t:null,ot=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),it=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),Xt=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},Wt={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},Vt=t=>{let e=new Map;return(s,i)=>{let y=e.get(s);y&&e.delete(s);let m=y??{tokens:t,lastRefillMs:i},M=Math.max(0,i-m.lastRefillMs);M>0&&(m.tokens=Math.min(t,m.tokens+M*t/6e4),m.lastRefillMs=i);let h=m.tokens>=1;for(h&&(m.tokens-=1),e.set(s,m);e.size>zt;){let O=e.keys().next();if(O.done)break;e.delete(O.value)}return h}},Zt=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},er=(t,e,s)=>{let i=setTimeout(e,s);i.unref?.();let y=()=>{clearTimeout(i),e()},m=!1;return new ReadableStream({pull(M){if(m){M.close(),y();return}m=!0,M.enqueue(t)},cancel(){y()}})};function ze(t){let{authenticate:e,service:s,encodeUserId:i,redis:y,sseReader:m,streamKey:M}=t,h=t.loginRedirectPath??"/auth/login",O=t.logger??ne(3,"[DailyReportAPI]"),u=t.logger??ne(1,"[DailyReportSSE]"),N=t.logger??ne(1,"[DailyReportAttachment]"),p=t.attachmentMaxBytes??Yt,K=Vt(t.attachmentRateLimitPerMinute??Ot),q=Zt(t.attachmentConcurrency??qt),U=async({request:k})=>{let{user:H,cookie:v}=await e(k,{failureRedirect:h}),x=new Headers;v&&x.append("Set-Cookie",v);let R=null;H&&(R=await s.getUserIdByExternalId(H.id));let C=R?i(R):null;return{data:{user:H,userId:C},headers:x}},me={"business-date":async(k,H,v,x)=>{let R=ee(k.searchParams.get("businessDate")),C=k.searchParams.get("forceRefresh")==="true";if(!R)return ae(v,H,{error:{message:"Invalid business date"}},400);let $=await s.getDailyReportsByBusinessDateByExternalId(R,x.id,{forceRefresh:C});return ae(v,H,{businessDate:R,reports:$},200)},"ids-stream":async(k,H,v,x)=>{let R=Ht(k);if("invalid"in R)return ae(v,H,{error:{message:"Invalid cursor"}},400);let C=k.searchParams.get("forceRefresh")==="true",$=s.getDailyReportIdsByExternalId(x.id,{forceRefresh:C});if($.catch(()=>{}),R.cursor)return at(H,nt(await $,R.cursor),v,O);let E=s.getDailyReportIdsFirstPageByExternalId(x.id,ve);E.catch(()=>{});let D=(async function*(){let w=await Promise.race([$.then(g=>({kind:"full",items:g}),g=>({kind:"full-error",error:g})),E.then(g=>({kind:"page",items:g}),()=>({kind:"page-error"}))]),I=null,_=null;if(w.kind==="full")_=w.items;else if(w.kind==="page"||w.kind==="full-error"){let g=w.kind==="page"?w.items:await E;if(g.length<ve){yield{items:g,nextCursor:null,isLast:!0,total:g.length};return}let P=g[g.length-1];I={businessDate:P.businessDate,reportHubId:P.reportHubId},yield{items:g,nextCursor:I,isLast:!1}}_===null&&(_=await $),yield*nt(_,I,I?st:ve)})();return at(H,D,v,O)},report:async(k,H,v,x)=>{let R=k.searchParams.get("reportHubId"),C=k.searchParams.get("forceRefresh")==="true",$=R?Number.parseInt(R,10):NaN;if(!Number.isFinite($)||$<=0)return ae(v,H,{error:{message:"Invalid reportHubId"}},400);let E=await s.getDailyReportDetailByIdByExternalId($,x.id,{snapshot:!0,forceRefresh:C});return E?ae(v,H,{report:E},200):ae(v,H,{error:{message:"Report not found"}},404)}};return{index:{loader:U},api:{loader:async({request:k,params:H})=>{let{user:v,cookie:x}=await e(k,{failureRedirect:null}),R=x??null;if(!v)return ae(k,R,{error:{message:"Unauthorized"}},401);if(k.method!=="GET")return ae(k,R,{error:{message:"Method not allowed"}},405);let C=H.endpoint??"",$=me[C];if(!$)return ae(k,R,{error:{message:"Unknown endpoint"}},404);let E=Date.now();try{let D=new URL(k.url);return await $(D,R,k,v)}catch(D){let w=Date.now()-E,I=D instanceof Error?D:new Error(String(D));return O.error(`500 endpoint=${C} elapsed=${w}ms name=${I.name} code=${"code"in I?I.code:"N/A"} message=${I.message}`),O.error("Stack:",I.stack),ae(k,R,{error:{message:"Internal Server Error"}},500)}},action:async({request:k,params:H})=>{let{user:v}=await e(k,{failureRedirect:null});if(!v)return L({error:"Unauthorized"},{status:401});if(H.endpoint!=="action")return L({error:"Unknown endpoint"},{status:404});let R=await s.getUserIdByExternalId(v.id);if(!R)return L({error:"User not found"},{status:404});let C=await k.formData(),$=C.get("intent"),E=C.get("reportHubId"),D=E?Number(E):NaN,w=C.get("businessDate"),I=Number(C.get("operationTimestamp")),_=C.get("clientTempId");if($==="clearCache")return t.enableDevCacheClear?(await s.clearCache(),L({status:"OK",intent:"clearCache"})):L({error:"Invalid intent"},{status:400});if(!_)return L({error:"clientTempId required"},{status:400});if($!=="create"&&(!D||Number.isNaN(D)))return L({error:"Invalid reportHubId"},{status:400});switch($){case"create":{if(!w)return L({error:"businessDate required"},{status:400});let g=await s.createDailyReport(R,w,_);return L({status:"OK",intent:"create",report:g,reportHubId:String(g.reportHubId),clientTempId:_})}case"update":{let g=C.get("title"),P=C.get("content");try{return await s.updateDailyReport(D,R,{title:g,content:P},_),L({status:"OK",intent:"update",reportHubId:String(D),clientTempId:_})}catch(F){if(F instanceof Error){if(F.message==="Unauthorized")return L({error:"Unauthorized"},{status:403});if(F.message==="Not Found")return L({error:"Report not found"},{status:404})}throw F}}case"publish":try{let g=await s.publishDailyReport(D,R,_);return L({status:"OK",intent:"publish",reportHubId:String(D),clientTempId:_,report:g})}catch(g){if(g instanceof Error){if(g.message==="Unauthorized")return L({error:"Unauthorized"},{status:403});if(g.message==="Not Found")return L({error:"Report not found"},{status:404})}throw g}case"delete":try{return await s.deleteDailyReport(D,R,_),L({status:"OK",intent:"delete",reportHubId:String(D),clientTempId:_})}catch(g){if(g instanceof Error){if(g.message==="Unauthorized")return L({error:"Unauthorized"},{status:403});if(g.message==="Not Found")return L({error:"Report not found"},{status:404})}throw g}case"toggleStar":{let g=C.get("isStarred");if(g===null)return L({error:"isStarred required"},{status:400});let P=g==="true",F=await s.setStarStatus(R,D,w,P,_);return L({status:"OK",intent:"toggleStar",updatedStatus:{isStarred:F.isStarred,isRead:F.isRead},operationTimestamp:I,reportHubId:String(D),clientTempId:_})}case"toggleRead":{let g=C.get("isRead");if(g===null)return L({error:"isRead required"},{status:400});let P=g==="true",F=await s.setReadStatus(R,D,w,P,_);return L({status:"OK",intent:"toggleRead",updatedStatus:{isStarred:F.isStarred,isRead:F.isRead},operationTimestamp:I,reportHubId:String(D),clientTempId:_})}case"addComment":{let g=C.get("content");if(!g)return L({error:"Content required"},{status:400});try{let P=await s.addComment(R,D,g,w,_),F={...P,userId:P.userId};return L({status:"OK",intent:"addComment",newComment:F,reportHubId:String(D),clientTempId:_})}catch(P){if(P instanceof Error){if(P.message==="Not Found")return L({error:"Report not found"},{status:404});if(P.message.startsWith("Comments are restricted"))return L({error:"Comments are restricted for this report"},{status:403})}throw P}}case"deleteComment":{let g=Number(C.get("commentId"));if(!g||Number.isNaN(g))return L({error:"Invalid commentId"},{status:400});try{return await s.deleteComment(R,D,g,w,_),L({status:"OK",reportHubId:String(D),deletedCommentId:String(g),clientTempId:_})}catch(P){if(P instanceof Error){if(P.message==="Unauthorized")return L({error:"Unauthorized"},{status:403});if(P.message==="Not Found")return L({error:"Comment not found"},{status:404})}throw P}}default:return L({error:"Invalid intent"},{status:400})}}},sse:{loader:async({request:k,params:H})=>{let{user:v}=await e(k,{failureRedirect:null});if(!v)return new Response("Unauthorized",{status:401});let x=await s.getUserIdByExternalId(v.id);if(!x)return new Response("Forbidden",{status:403});if(H.endpoint!=="updates")return new Response("Not Found",{status:404});let C=new URL(k.url).searchParams.get("lastEventId")||k.headers.get("Last-Event-ID"),$=new TextEncoder,E=null,D=null,w=null,I=!1,_=()=>{if(!I){if(I=!0,D&&(clearInterval(D),D=null),w&&(w(),w=null),E)try{E.desiredSize!==null&&E.close()}catch{}finally{E=null}I=!1}},g=(F,G)=>{if(G.data)try{let T=JSON.parse(G.data),W=Ze.safeParse(T);if(!W.success){u.error("SSE message validation failed:",W.error.format());return}let te=W.data,se=typeof T.recipientRawUserId=="number"?T.recipientRawUserId:void 0;if(te.type==="status-update"){if(se===void 0||se!==x)return}else if(se!==void 0&&se!==x)return;let re;if("recipientRawUserId"in T){let{recipientRawUserId:be,...ye}=T;re=JSON.stringify(ye)}else re=G.data;E&&E.desiredSize!==null&&E.enqueue($.encode(`id: ${F}
5
- data: ${re}
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:q,done:H}=z;if(H){u.close();return}if(c||n.signal.aborted){await e.return(void 0).catch(()=>{});try{u.close()}catch{}return}u.enqueue(m.encode(`${JSON.stringify(q)}
3
+ `))}catch(h){if(x!==null&&clearTimeout(x),A=null,c||n.signal.aborted)return;i.error(`ids-stream emission failed: ${h instanceof Error?h.message:String(h)}`);try{u.enqueue(m.encode(`${JSON.stringify({error:Pt})}
4
+ `)),u.close()}catch{}}},cancel(){c=!0,e.return(void 0).catch(()=>{})}}),L=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"private, no-cache, no-transform","X-Content-Type-Options":"nosniff"});return t&&L.append("Set-Cookie",t),new Response(p,{status:200,headers:L})},Yt=32*1024*1024,Ot=60,qt=4,Ft=12e4,zt=1024,Kt=60,Jt=5,jt=new Set(["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain"]),Qt=/^[\x20-\x7E]+$/,Gt=/^[\w.+-]+\/[\w.+-]+/,Fe=t=>t&&Qt.test(t)&&Gt.test(t)?t:null,it=t=>encodeURIComponent(t).replace(/['()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),ot=t=>t.replace(/[^\x20-\x7E]/g,"_").replace(/["\\]/g,"_"),Xt=t=>{switch(t){case"not_found":case"denied":case"invalid_path":return 404;case"too_large":return 413;default:return 502}},Wt={404:"Attachment not found",413:"Attachment too large",502:"Attachment storage unavailable"},Vt=t=>{let e=new Map;return(n,i)=>{let m=e.get(n);m&&e.delete(n);let c=m??{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 p=c.tokens>=1;for(p&&(c.tokens-=1),e.set(n,c);e.size>zt;){let L=e.keys().next();if(L.done)break;e.delete(L.value)}return p}},Zt=t=>{let e=0;return{tryAcquire:()=>e>=t?!1:(e+=1,!0),release:()=>{e>0&&(e-=1)}}},er=(t,e,n)=>{let i=setTimeout(e,n);i.unref?.();let m=()=>{clearTimeout(i),e()},c=!1;return new ReadableStream({pull(A){if(c){A.close(),m();return}c=!0,A.enqueue(t)},cancel(){m()}})};function ze(t){let{authenticate:e,service:n,encodeUserId:i,redis:m,sseReader:c,streamKey:A}=t,p=t.loginRedirectPath??"/auth/login",L=t.logger??se(3,"[DailyReportAPI]"),u=t.logger??se(1,"[DailyReportSSE]"),x=t.logger??se(1,"[DailyReportAttachment]"),h=t.attachmentMaxBytes??Yt,z=Vt(t.attachmentRateLimitPerMinute??Ot),q=Zt(t.attachmentConcurrency??qt),H=async({request:E})=>{let{user:Y,cookie:k}=await e(E,{failureRedirect:p}),v=new Headers;k&&v.append("Set-Cookie",k);let R=null;Y&&(R=await n.getUserIdByExternalId(Y.id));let _=R?i(R):null;return{data:{user:Y,userId:_},headers:v}},pe={"business-date":async(E,Y,k,v)=>{let R=re(E.searchParams.get("businessDate")),_=E.searchParams.get("forceRefresh")==="true";if(!R)return ie(k,Y,{error:{message:"Invalid business date"}},400);let P=await n.getDailyReportsByBusinessDateByExternalId(R,v.id,{forceRefresh:_});return ie(k,Y,{businessDate:R,reports:P},200)},"ids-stream":async(E,Y,k,v)=>{let R=Ht(E);if("invalid"in R)return ie(k,Y,{error:{message:"Invalid cursor"}},400);let _=E.searchParams.get("forceRefresh")==="true",P=n.getDailyReportIdsByExternalId(v.id,{forceRefresh:_});if(P.catch(()=>{}),R.cursor)return at(Y,nt(await P,R.cursor),k,L);let M=n.getDailyReportIdsFirstPageByExternalId(v.id,xe);M.catch(()=>{});let D=(async function*(){let w=await Promise.race([P.then(b=>({kind:"full",items:b}),b=>({kind:"full-error",error:b})),M.then(b=>({kind:"page",items:b}),()=>({kind:"page-error"}))]),N=null,C=null;if(w.kind==="full")C=w.items;else if(w.kind==="page"||w.kind==="full-error"){let b=w.kind==="page"?w.items:await M;if(b.length<xe){yield{items:b,nextCursor:null,isLast:!0,total:b.length};return}let B=b[b.length-1];N={businessDate:B.businessDate,reportHubId:B.reportHubId},yield{items:b,nextCursor:N,isLast:!1}}C===null&&(C=await P),yield*nt(C,N,N?st:xe)})();return at(Y,D,k,L)},report:async(E,Y,k,v)=>{let R=E.searchParams.get("reportHubId"),_=E.searchParams.get("forceRefresh")==="true",P=R?Number.parseInt(R,10):NaN;if(!Number.isFinite(P)||P<=0)return ie(k,Y,{error:{message:"Invalid reportHubId"}},400);let M=await n.getDailyReportDetailByIdByExternalId(P,v.id,{snapshot:!0,forceRefresh:_});return M?ie(k,Y,{report:M},200):ie(k,Y,{error:{message:"Report not found"}},404)}};return{index:{loader:H},api:{loader:async({request:E,params:Y})=>{let{user:k,cookie:v}=await e(E,{failureRedirect:null}),R=v??null;if(!k)return ie(E,R,{error:{message:"Unauthorized"}},401);if(E.method!=="GET")return ie(E,R,{error:{message:"Method not allowed"}},405);let _=Y.endpoint??"",P=pe[_];if(!P)return ie(E,R,{error:{message:"Unknown endpoint"}},404);let M=Date.now();try{let D=new URL(E.url);return await P(D,R,E,k)}catch(D){let w=Date.now()-M,N=D instanceof Error?D:new Error(String(D));return L.error(`500 endpoint=${_} elapsed=${w}ms name=${N.name} code=${"code"in N?N.code:"N/A"} message=${N.message}`),L.error("Stack:",N.stack),ie(E,R,{error:{message:"Internal Server Error"}},500)}},action:async({request:E,params:Y})=>{let{user:k}=await e(E,{failureRedirect:null});if(!k)return $({error:"Unauthorized"},{status:401});if(Y.endpoint!=="action")return $({error:"Unknown endpoint"},{status:404});let R=await n.getUserIdByExternalId(k.id);if(!R)return $({error:"User not found"},{status:404});let _=await E.formData(),P=_.get("intent"),M=_.get("reportHubId"),D=M?Number(M):NaN,w=_.get("businessDate"),N=Number(_.get("operationTimestamp")),C=_.get("clientTempId");if(P==="clearCache")return t.enableDevCacheClear?(await n.clearCache(),$({status:"OK",intent:"clearCache"})):$({error:"Invalid intent"},{status:400});if(!C)return $({error:"clientTempId required"},{status:400});if(P!=="create"&&(!D||Number.isNaN(D)))return $({error:"Invalid reportHubId"},{status:400});switch(P){case"create":{if(!w)return $({error:"businessDate required"},{status:400});let b=await n.createDailyReport(R,w,C);return $({status:"OK",intent:"create",report:b,reportHubId:String(b.reportHubId),clientTempId:C})}case"update":{let b=_.get("title"),B=_.get("content");try{return await n.updateDailyReport(D,R,{title:b,content:B},C),$({status:"OK",intent:"update",reportHubId:String(D),clientTempId:C})}catch(K){if(K instanceof Error){if(K.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(K.message==="Not Found")return $({error:"Report not found"},{status:404})}throw K}}case"publish":try{let b=await n.publishDailyReport(D,R,C);return $({status:"OK",intent:"publish",reportHubId:String(D),clientTempId:C,report:b})}catch(b){if(b instanceof Error){if(b.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(b.message==="Not Found")return $({error:"Report not found"},{status:404})}throw b}case"delete":try{return await n.deleteDailyReport(D,R,C),$({status:"OK",intent:"delete",reportHubId:String(D),clientTempId:C})}catch(b){if(b instanceof Error){if(b.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(b.message==="Not Found")return $({error:"Report not found"},{status:404})}throw b}case"toggleStar":{let b=_.get("isStarred");if(b===null)return $({error:"isStarred required"},{status:400});let B=b==="true",K=await n.setStarStatus(R,D,w,B,C);return $({status:"OK",intent:"toggleStar",updatedStatus:{isStarred:K.isStarred,isRead:K.isRead},operationTimestamp:N,reportHubId:String(D),clientTempId:C})}case"toggleRead":{let b=_.get("isRead");if(b===null)return $({error:"isRead required"},{status:400});let B=b==="true",K=await n.setReadStatus(R,D,w,B,C);return $({status:"OK",intent:"toggleRead",updatedStatus:{isStarred:K.isStarred,isRead:K.isRead},operationTimestamp:N,reportHubId:String(D),clientTempId:C})}case"addComment":{let b=_.get("content");if(!b)return $({error:"Content required"},{status:400});try{let B=await n.addComment(R,D,b,w,C),K={...B,userId:B.userId};return $({status:"OK",intent:"addComment",newComment:K,reportHubId:String(D),clientTempId:C})}catch(B){if(B instanceof Error){if(B.message==="Not Found")return $({error:"Report not found"},{status:404});if(B.message.startsWith("Comments are restricted"))return $({error:"Comments are restricted for this report"},{status:403})}throw B}}case"deleteComment":{let b=Number(_.get("commentId"));if(!b||Number.isNaN(b))return $({error:"Invalid commentId"},{status:400});try{return await n.deleteComment(R,D,b,w,C),$({status:"OK",reportHubId:String(D),deletedCommentId:String(b),clientTempId:C})}catch(B){if(B instanceof Error){if(B.message==="Unauthorized")return $({error:"Unauthorized"},{status:403});if(B.message==="Not Found")return $({error:"Comment not found"},{status:404})}throw B}}default:return $({error:"Invalid intent"},{status:400})}}},sse:{loader:async({request:E,params:Y})=>{let{user:k}=await e(E,{failureRedirect:null});if(!k)return new Response("Unauthorized",{status:401});let v=await n.getUserIdByExternalId(k.id);if(!v)return new Response("Forbidden",{status:403});if(Y.endpoint!=="updates")return new Response("Not Found",{status:404});let _=new URL(E.url).searchParams.get("lastEventId")||E.headers.get("Last-Event-ID"),P=new TextEncoder,M=null,D=null,w=null,N=!1,C=()=>{if(!N){if(N=!0,D&&(clearInterval(D),D=null),w&&(w(),w=null),M)try{M.desiredSize!==null&&M.close()}catch{}finally{M=null}N=!1}},b=(K,Q)=>{if(Q.data)try{let T=JSON.parse(Q.data),W=Ze.safeParse(T);if(!W.success){u.error("SSE message validation failed:",W.error.format());return}let ee=W.data,ae=typeof T.recipientRawUserId=="number"?T.recipientRawUserId:void 0;if(ee.type==="status-update"){if(ae===void 0||ae!==v)return}else if(ae!==void 0&&ae!==v)return;let de;if("recipientRawUserId"in T){let{recipientRawUserId:be,...oe}=T;de=JSON.stringify(oe)}else de=Q.data;M&&M.desiredSize!==null&&M.enqueue(P.encode(`id: ${K}
5
+ data: ${de}
6
6
 
7
- `))}catch(T){u.error(`[SSE:${x}] processEntry error:`,T)}},P=new ReadableStream({async start(F){E=F,D=setInterval(()=>{try{E&&E.desiredSize!==null?E.enqueue($.encode(`: keep-alive
7
+ `))}catch(T){u.error(`[SSE:${v}] processEntry error:`,T)}},B=new ReadableStream({async start(K){M=K,D=setInterval(()=>{try{M&&M.desiredSize!==null?M.enqueue(P.encode(`: keep-alive
8
8
 
9
- `)):_()}catch{_()}},5e3),k.signal.addEventListener("abort",()=>{_()});let G=C||"0-0";if(w=m.subscribe(T=>{we(T.id,G)||(G=T.id,g(T.id,T.message))},T=>{u.error(`[SSE:${x}] Fan-Out reader error:`,T),_()}),!C)try{let T=await y?.getClient();if(T){let W=await T.xRevRange(M,"+","-",{COUNT:1});W.length>0&&!we(W[0].id,G)&&(G=W[0].id)}}catch{}if(E&&E.desiredSize!==null){let T=`data: ${JSON.stringify({type:"connected"})}
9
+ `)):C()}catch{C()}},5e3),E.signal.addEventListener("abort",()=>{C()});let Q=_||"0-0";if(w=c.subscribe(T=>{Se(T.id,Q)||(Q=T.id,b(T.id,T.message))},T=>{u.error(`[SSE:${v}] Fan-Out reader error:`,T),C()}),!_)try{let T=await m?.getClient();if(T){let W=await T.xRevRange(A,"+","-",{COUNT:1});W.length>0&&!Se(W[0].id,Q)&&(Q=W[0].id)}}catch{}if(M&&M.desiredSize!==null){let T=`data: ${JSON.stringify({type:"connected"})}
10
10
 
11
- `,W=G!=="0-0"?`id: ${G}
12
- ${T}`:T;E.enqueue($.encode(W))}if(C)try{let T=await y?.getClient();if(T){let W=await T.xRange(M,C,"+",{COUNT:1e3});for(let te of W)te.id!==C&&(we(te.id,G)||(G=te.id,g(te.id,te.message)))}}catch(T){u.error(`[SSE:${x}] catch-up xRange error:`,T)}},cancel(){_()}});return new Response(P,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive"}})}},attachment:{loader:async({request:k,params:H})=>{let v=null,x=(R,C,$)=>{let E=new Headers({"Content-Type":"application/json"});return $!==void 0&&E.set("Retry-After",String($)),v&&E.append("Set-Cookie",v),new Response(JSON.stringify({error:{message:C}}),{status:R,headers:E})};try{let{user:R,cookie:C}=await e(k,{failureRedirect:null});if(v=C??null,!R)return x(401,"Unauthorized");if(k.method!=="GET"&&k.method!=="HEAD")return x(405,"Method not allowed");let $=t.attachmentIdCodec,E=t.readAttachment;if(!($&&E))return x(404,"Attachment not found");let D=H.token??"",w=$.decode(D);if(w===null||!Number.isSafeInteger(w)||w<=0)return x(400,"Invalid attachment token");let I=await s.getUserIdByExternalId(R.id);if(!I)return x(403,"Forbidden");if(!K(I,Date.now()))return N.error(`429 attachment=${w} viewer=${I} reason=rate_limit`),x(429,"Too many requests",Kt);let _=await s.getAttachmentForUser(w,I);if(!_)return N.error(`404 attachment=${w} viewer=${I} reason=not_visible`),x(404,"Attachment not found");if(_.fileSize!=null&&_.fileSize>p)return N.error(`413 attachment=${w} viewer=${I} reason=db_size`),x(413,"Attachment too large");if(!q.tryAcquire())return N.error(`503 attachment=${w} viewer=${I} reason=concurrency`),x(503,"Too many concurrent downloads",Jt);let g=!1,P=()=>{g||(g=!0,q.release())},F=!1;try{let G=k.method==="HEAD",T=await E(_.filePath,{maxBytes:p,head:G,principal:i(I)});if(!T.ok){let oe=Xt(T.reason);return T.reason==="not_found"&&s.markAttachmentMissing(w).catch(le=>{N.error(`markAttachmentMissing failed attachment=${w} message=${le instanceof Error?le.message:"unknown"}`)}),N.error(`${oe} attachment=${w} viewer=${I} reason=${T.reason} code=${T.code??"-"}`),x(oe,Wt[oe]??"Attachment storage unavailable")}let W=Fe(_.fileType)??Fe(T.contentType)??"application/octet-stream",te=jt.has(W),se=new URL(k.url).searchParams.get("download")==="1",re=te?W:"application/octet-stream",be=te&&!se?"inline":"attachment",ye=T.size??T.bytes.byteLength,ie=new Headers({"Content-Type":re,"Content-Length":String(ye),"Content-Disposition":`${be}; filename="${it(_.fileName)}"; filename*=UTF-8''${ot(_.fileName)}`,"Cache-Control":"private, no-store","X-Content-Type-Options":"nosniff","Content-Security-Policy":"default-src 'none'; sandbox","X-Frame-Options":"SAMEORIGIN"});return v&&ie.append("Set-Cookie",v),s.markAttachmentPresent(w).catch(oe=>{N.error(`markAttachmentPresent failed attachment=${w} message=${oe instanceof Error?oe.message:"unknown"}`)}),N.info(`200 attachment=${w} viewer=${I} type=${re} disposition=${be} bytes=${ye}`),G?new Response(null,{status:200,headers:ie}):(F=!0,new Response(er(T.bytes,P,Ft),{status:200,headers:ie}))}finally{F||P()}}catch(R){if(R instanceof Response)throw R;return N.error(`500 attachment=? viewer=? reason=unexpected message=${R instanceof Error?R.message:"unknown"}`),x(500,"Attachment request failed")}}}}}var n=require("drizzle-orm");var pe=t=>(0,n.getColumns)(t);function Ke(t){let{db:e,tables:s,userTable:i,resolveUserId:y,encodeUserId:m,redis:M,cache:h,epochs:O}=t,{hub:u,internal:N,comment:p,label:K,hubLabel:q,userStatus:U}=s,me=t.externalSources??[],Ae=t.draftLabelNames&&t.draftLabelNames.length>0?t.draftLabelNames:[t.draftLabelName??"\u4E0B\u66F8\u304D"],Ce=Ae[0]??"\u4E0B\u66F8\u304D",V=t.logger??ne(1,"[DailyReportService]"),fe="daily-report:ids",k=t.idsTtlMs??18e4,H="daily-report:ids:epoch",v="daily-report:business-date:",x=t.businessDateTtlMs??3e5,R="daily-report:date-epoch:",C="daily-report:detail-epoch:",$=t.streamKey??"daily-report:sse-stream",E=t.streamMaxLen??1e4,D=r=>O.incrementEpoch(r),w=async(r,a)=>{let o=await M?.getClient();if(!o){V.warn(`[SSE] Redis client unavailable (${a})`);return}let c=Date.now();try{await o.xAdd($,"*",{data:JSON.stringify(r)},{TRIM:{strategy:"MAXLEN",strategyModifier:"~",threshold:E}});let b=Date.now()-c;b>1e3&&V.warn(`[SSE] Slow publish (${a}): ${b}ms`)}catch(b){V.error(`[SSE] Redis publish failed (${a}):`,b)}},I=(r,a)=>{if(!r)return null;let o=r instanceof Date?r:new Date(r);if(Number.isNaN(o.getTime()))return typeof r=="string"?r:null;let c=a==="YYYY-MM-DD HH:mm:ss"?{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}:{year:"numeric",month:"2-digit",day:"2-digit"};return(a==="YYYY-MM-DD HH:mm:ss"?o.toLocaleString("ja-JP",c):o.toLocaleDateString("ja-JP",c)).replace(/\//g,"-")},_=r=>r==null||r===""?null:/^\d+$/.test(r)?m(Number(r)):r,g=()=>{let r={};for(let a of me)r[`ext_${a.sourceType}`]=pe(a.table);return r},P=r=>{let a=r;for(let o of me)a=a.leftJoin(o.table,(0,n.and)((0,n.eq)(u.sourceType,o.sourceType),(0,n.eq)(u.sourceIdNum,o.idColumn)));return a},F=(r,a)=>{let{hub:o,internal:c}=r,b=o.summary,f=[],S=null,A=null,z=null,j=null,Y=null,Q=null,ue=[],ce=me.find(B=>B.sourceType===o.sourceType),he=ce?r[`ext_${ce.sourceType}`]:void 0;if(ce&&he){let B=ce.mapRow(he);B.content!==void 0&&(b=B.content),B.employeeName!==void 0&&(Q=B.employeeName),B.category!==void 0&&(S=B.category),B.creationCategory!==void 0&&(A=B.creationCategory),B.visitTimeFrom!==void 0&&(z=B.visitTimeFrom),B.visitTimeTo!==void 0&&(j=B.visitTimeTo),B.customerName!==void 0&&(Y=B.customerName),B.interviewers!==void 0&&(f=B.interviewers),B.comments!==void 0&&(ue=B.comments)}else o.sourceType==="Internal"&&c&&(b=c.body);let de=(r.labels??[]).map(B=>({id:B.id,name:B.name,color:B.color})),Z=r.comments??[],J=A?Ae.includes(A):!1,X=ie?.[0]??null;return J&&X&&!de.some(B=>B.id===X)&&de.push({id:X,name:Ce,color:null}),{reportHubId:o.id,date:I(o.businessDate,"YYYY-MM-DD"),author:r.creatorName??_(o.createdBy)??"",userId:o.userId?m(o.userId):"",sourceType:o.sourceType??"Internal",createdAt:I(o.createdAt,"YYYY-MM-DD HH:mm:ss"),updatedAt:I(o.updatedAt,"YYYY-MM-DD HH:mm:ss"),updatedBy:_(o.updatedBy),employeeName:Q??r.creatorName??_(o.createdBy),category:S,creationCategory:A,visitTimeFrom:z,visitTimeTo:j,customerName:Y,interviewers:f,subject:o.title,content:b,comments:ue,isRead:r.isRead??!1,isStarred:r.isStarred??!1,labels:de,commentItems:Z.map(B=>({...B,userId:m(B.userId),isMine:a?B.userId===a:!1})),attachments:r.attachments}},G=async r=>{let a=(0,n.aliasedTable)(q,"draft_label"),o=await le();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).from(u).leftJoin(a,(0,n.and)((0,n.eq)(a.hubId,u.id),(0,n.inArray)(a.labelId,o))).where((0,n.and)((0,n.isNull)(u.deletedAt),(0,n.or)((0,n.eq)(u.userId,r),(0,n.isNull)(u.userId),(0,n.isNull)(a.hubId)))).orderBy((0,n.desc)(u.businessDate),(0,n.desc)(u.id))).map(b=>({...b,businessDate:I(b.businessDate,"YYYY-MM-DD")}))},T=async(r,a)=>{let o=await re(r);if(!o)return[];let c=(0,n.aliasedTable)(q,"draft_label"),b=await le();return(await e.select({reportHubId:u.id,businessDate:u.businessDate,sourceType:u.sourceType}).top(a).from(u).leftJoin(c,(0,n.and)((0,n.eq)(c.hubId,u.id),(0,n.inArray)(c.labelId,b))).where((0,n.and)((0,n.isNull)(u.deletedAt),(0,n.or)((0,n.eq)(u.userId,o),(0,n.isNull)(u.userId),(0,n.isNull)(c.hubId)))).orderBy((0,n.desc)(u.businessDate),(0,n.desc)(u.id))).map(S=>({...S,businessDate:I(S.businessDate,"YYYY-MM-DD")}))},W=async r=>{let a=await P(e.select({hub:pe(u),internal:pe(N),creatorName:i.displayName,...g()}).from(u)).leftJoin(N,(0,n.eq)(u.id,N.hubId)).leftJoin(i,(0,n.eq)(u.userId,i.id)).where((0,n.and)((0,n.eq)(u.businessDate,n.sql`${r}`),(0,n.isNull)(u.deletedAt))).orderBy((0,n.desc)(u.id)),o=await _e(a.map(c=>c.hub.id));return a.map(c=>F({...c,attachments:o.get(c.hub.id)??[]}))},te=r=>`${v}${r}`,se=new Map,re=async r=>{if(!t.disableUserIdCache&&se.has(r))return se.get(r)??null;let a=await y(r);return a!==null&&!t.disableUserIdCache&&se.set(r,a),a},be=async(r,{forceRefresh:a=!1,snapshot:o=!1,ttlMsOverride:c}={})=>{let b=await re(r);if(!b)return[];let f=`${fe}:user:${b}`;return h.getOrFetch({cacheKey:f,fetcher:async()=>await G(b),forceRefresh:a,snapshot:o,ttlMsOverride:c??k,epochKey:H})},ye=(r,{forceRefresh:a=!1,snapshot:o=!1,ttlMsOverride:c}={})=>{let b=ee(r);return b?h.getOrFetch({cacheKey:te(b),fetcher:()=>W(b),forceRefresh:a,snapshot:o,ttlMsOverride:c??x}):Promise.resolve([])},ie=null,oe=async()=>(ie!==null||(ie=(await e.select({id:K.id}).from(K).where((0,n.inArray)(K.name,Ae)).orderBy(K.id)).map(a=>a.id)),ie),le=async()=>{let r=await oe();return r.length>0?r:[-1]},xe=async()=>{let r=await oe();if(r.length===0)return null;let[a]=await e.select({id:K.id}).top(1).from(K).where((0,n.eq)(K.name,Ce));return a?.id??r[0]},ut=(r,a)=>a!=null?"absent":r!=null?"present":"unknown",_e=async r=>{let a=new Map,o=s.attachment,c=t.attachmentIdCodec;if(r.length===0||!o||!c)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,n.inArray)(o.hubId,r)).orderBy((0,n.asc)(o.createdAt),(0,n.asc)(o.id));for(let f of b){let S={id:c.encode(Number(f.id)),fileName:String(f.fileName),fileType:f.fileType?String(f.fileType):null,fileSize:f.fileSize!=null?Number(f.fileSize):null,createdAt:I(f.createdAt,"YYYY-MM-DD HH:mm:ss"),state:ut(f.objectCheckedAt,f.objectMissingAt)},A=a.get(Number(f.hubId));A?A.push(S):a.set(Number(f.hubId),[S])}return a},dt=async(r,a)=>{let o=s.attachment;if(!o)return null;let c=await le(),b=(0,n.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,n.eq)(u.id,o.hubId)).leftJoin(b,(0,n.and)((0,n.eq)(b.hubId,u.id),(0,n.inArray)(b.labelId,c))).where((0,n.and)((0,n.eq)(o.id,r),(0,n.isNull)(u.deletedAt),(0,n.or)((0,n.eq)(u.userId,a),(0,n.isNull)(b.hubId)))))[0]??null},ct=async r=>{let a=s.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:o,updatedAt:o}).where((0,n.eq)(a.id,r))}catch(c){V.error("markAttachmentMissing failed",c)}},mt=async r=>{let a=s.attachment;if(!a)return;let o=new Date;try{await e.update(a).set({objectCheckedAt:o,objectMissingAt:null,updatedAt:o}).where((0,n.eq)(a.id,r))}catch(c){V.error("markAttachmentPresent failed",c)}},pt=async(r,a,{forceRefresh:o=!1,snapshot:c=!1,ttlMsOverride:b}={})=>{let f=await re(a);if(!f)return[];let S=ee(r);if(!S)return[];let A=`daily-report:date:${S}:user:${f}`;return h.getOrFetch({cacheKey:A,fetcher:async()=>{let z=await le(),j=(0,n.aliasedTable)(q,"draft_label"),Y=await P(e.select({hub:pe(u),internal:pe(N),isRead:U.isRead,isStarred:U.isStarred,creatorName:i.displayName,...g()}).from(u)).leftJoin(N,(0,n.eq)(u.id,N.hubId)).leftJoin(U,(0,n.and)((0,n.eq)(u.id,U.hubId),(0,n.eq)(U.userId,f))).leftJoin(j,(0,n.and)((0,n.eq)(j.hubId,u.id),(0,n.inArray)(j.labelId,z))).leftJoin(i,(0,n.eq)(u.userId,i.id)).where((0,n.and)((0,n.eq)(u.businessDate,n.sql`${S}`),(0,n.isNull)(u.deletedAt),(0,n.or)((0,n.eq)(u.userId,f),(0,n.isNull)(j.hubId)))).orderBy((0,n.desc)(u.id));if(Y.length===0)return[];let Q=Y.map(J=>J.hub.id),ue=await e.select({hubId:q.hubId,id:K.id,name:K.name,color:K.color}).from(q).innerJoin(K,(0,n.eq)(q.labelId,K.id)).where((0,n.inArray)(q.hubId,Q)),ce=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,n.eq)(p.userId,i.id)).where((0,n.inArray)(p.hubId,Q)).orderBy((0,n.asc)(p.createdAt)),he=await _e(Q),de=new Map,Z=new Map;for(let J of ue){let X=de.get(J.hubId);X||(X=[],de.set(J.hubId,X)),X.push({id:J.id,name:J.name,color:J.color})}for(let J of ce){let X=Z.get(J.hubId);X||(X=[],Z.set(J.hubId,X)),X.push({id:J.id,content:J.body,createdAt:I(J.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:J.userId,userName:J.userName||""})}return Y.map(J=>{let X=J.hub.id;return F({...J,attachments:he.get(X)??[],labels:de.get(X)||[],comments:Z.get(X)||[]},f)})},forceRefresh:o,snapshot:c,ttlMsOverride:b??x,epochKey:`${R}${S}`})},ge=async(r,a,{forceRefresh:o=!1,snapshot:c=!1,ttlMsOverride:b}={})=>{let f=`daily-report:detail:${r}:user:${a}`;return(await h.getOrFetch({cacheKey:f,fetcher:async()=>{let A=await le(),z=(0,n.aliasedTable)(q,"draft_label"),j=await P(e.select({hub:pe(u),internal:pe(N),isRead:U.isRead,isStarred:U.isStarred,creatorName:i.displayName,...g()}).from(u)).leftJoin(N,(0,n.eq)(u.id,N.hubId)).leftJoin(U,(0,n.and)((0,n.eq)(u.id,U.hubId),(0,n.eq)(U.userId,a))).leftJoin(z,(0,n.and)((0,n.eq)(z.hubId,u.id),(0,n.inArray)(z.labelId,A))).leftJoin(i,(0,n.eq)(u.userId,i.id)).where((0,n.and)((0,n.eq)(u.id,r),(0,n.isNull)(u.deletedAt),(0,n.or)((0,n.eq)(u.userId,a),(0,n.isNull)(z.hubId))));if(j.length===0)return[];let Y=j[0].hub.id,Q=await e.select({id:K.id,name:K.name,color:K.color}).from(q).innerJoin(K,(0,n.eq)(q.labelId,K.id)).where((0,n.eq)(q.hubId,Y)),ue=await e.select({id:p.id,body:p.body,createdAt:p.createdAt,userId:p.userId,userName:i.displayName}).from(p).leftJoin(i,(0,n.eq)(p.userId,i.id)).where((0,n.eq)(p.hubId,Y)).orderBy((0,n.asc)(p.createdAt)),ce=await _e([Y]),he=Q.map(Z=>({id:Z.id,name:Z.name,color:Z.color})),de=ue.map(Z=>({id:Z.id,content:Z.body,createdAt:I(Z.createdAt,"YYYY-MM-DD HH:mm:ss")||"",userId:Z.userId,userName:Z.userName||""}));return[F({...j[0],attachments:ce.get(Y)??[],labels:he,comments:de},a)]},forceRefresh:o,snapshot:c,ttlMsOverride:b??x,epochKey:`${C}${r}`}))[0]??null},yt=async(r,a,o={})=>{let c=await re(a);return c?ge(r,c,o):null},ht=async(r,a,o,c,b)=>{let f=await e.select().top(1).from(U).where((0,n.and)((0,n.eq)(U.hubId,a),(0,n.eq)(U.userId,r))),S;if(f.length>0?f[0].isStarred!==c?S=(await e.update(U).set({isStarred:c,updatedAt:new Date,updatedBy:String(r)}).output().where((0,n.and)((0,n.eq)(U.hubId,a),(0,n.eq)(U.userId,r))))[0]:S=f[0]:S=(await e.insert(U).output().values({hubId:a,userId:r,isStarred:c,isRead:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let A=ee(o);A&&(h.invalidate(`daily-report:date:${A}:user:${r}`),await D(`${R}${A}`))}return h.invalidate(`daily-report:detail:${a}`),h.invalidate(`daily-report:detail:${a}:user:${r}`),await D(`${C}${a}`),await w(Me.parse({type:"status-update",reportHubId:a,recipientRawUserId:r,statusType:"star",value:c,clientTempId:b}),"setStarStatus"),S},ft=async(r,a,o,c,b)=>{let f=await e.select().top(1).from(U).where((0,n.and)((0,n.eq)(U.hubId,a),(0,n.eq)(U.userId,r))),S;if(f.length>0?f[0].isRead!==c?S=(await e.update(U).set({isRead:c,updatedAt:new Date,updatedBy:String(r)}).output().where((0,n.and)((0,n.eq)(U.hubId,a),(0,n.eq)(U.userId,r))))[0]:S=f[0]:S=(await e.insert(U).output().values({hubId:a,userId:r,isRead:c,isStarred:!1,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}))[0],o){let A=ee(o);A&&(h.invalidate(`daily-report:date:${A}:user:${r}`),await D(`${R}${A}`))}return h.invalidate(`daily-report:detail:${a}`),h.invalidate(`daily-report:detail:${a}:user:${r}`),await D(`${C}${a}`),await w(Me.parse({type:"status-update",reportHubId:a,recipientRawUserId:r,statusType:"read",value:c,clientTempId:b}),"setReadStatus"),S},Je=async(r,a)=>{if(a===null)return;let o=await le(),[c]=await e.select({hubId:q.hubId}).top(1).from(q).where((0,n.and)((0,n.eq)(q.hubId,r),(0,n.inArray)(q.labelId,o)));return c?a:void 0},bt=async(r,a,o,c,b)=>{let[f]=await e.select({sourceType:u.sourceType,deletedAt:u.deletedAt,userId:u.userId}).top(1).from(u).where((0,n.eq)(u.id,a));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(a,f.userId),[A]=await e.insert(p).output().values({hubId:a,userId:r,body:o,createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),[z]=await e.select({displayName:i.displayName}).top(1).from(i).where((0,n.eq)(i.id,r)),j=z?.displayName??"Unknown";if(c){let Q=ee(c);Q&&(h.invalidatePrefix(`daily-report:date:${Q}:user:`),await D(`${R}${Q}`))}h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(`daily-report:detail:${a}:user:`),await D(`${C}${a}`);let Y={id:A.id,userId:m(A.userId),userName:j,content:A.body,createdAt:I(A.createdAt,"YYYY-MM-DD HH:mm:ss")??"",isMine:!0};return await w(Be.parse({type:"comment-add",reportHubId:a,comment:Y,clientTempId:b,recipientRawUserId:S}),"addComment"),Y},gt=async(r,a)=>await r.select().top(1).from(p).where((0,n.eq)(p.id,a)),Rt=async(r,a,o,c,b)=>{let f=await gt(e,o);if(f.length===0)throw new Error("Not Found");if(f[0].userId!==r)throw new Error("Unauthorized");if(f[0].hubId!==a)throw new Error("Not Found");let[S]=await e.select({userId:u.userId}).top(1).from(u).where((0,n.eq)(u.id,a)),A=await Je(a,S?.userId??null);if(await e.delete(p).where((0,n.eq)(p.id,o)),c){let z=ee(c);z&&(h.invalidatePrefix(`daily-report:date:${z}:user:`),await D(`${R}${z}`))}h.invalidate(`daily-report:detail:${a}`),h.invalidatePrefix(`daily-report:detail:${a}:user:`),await D(`${C}${a}`),await w(Ue.parse({type:"comment-delete",reportHubId:a,commentId:o,clientTempId:b,recipientRawUserId:A}),"deleteComment")},Dt=async(r,a,o)=>{V.info("createDailyReport called",{userId:r,businessDate:a});let[c]=await e.select({displayName:i.displayName}).from(i).where((0,n.eq)(i.id,r)),b=c?.displayName??m(r);try{let f=await e.transaction(async z=>{V.info("Starting transaction");let j=`internal-temp-${Date.now()}-${Math.random()}`,[Y]=await z.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 z.update(u).set({sourceId:String(Y.id)}).where((0,n.eq)(u.id,Y.id)),V.info("Hub created",Y),await z.insert(N).values({hubId:Y.id,body:"",createdAt:new Date,createdBy:String(r),updatedAt:new Date,updatedBy:String(r)}),V.info("Internal created"),V.info("Calling getDraftLabelId");let Q=await xe();V.info("draftLabelId",Q);let ue=[];return Q&&(await z.insert(q).values({hubId:Y.id,labelId:Q,createdAt:new Date,createdBy:String(r)}),ue.push({id:Q,name:Ce,color:null})),V.info("Label assigned"),{reportHubId:Y.id,date:a,createdAt:I(Y.createdAt,"YYYY-MM-DD HH:mm:ss"),author:b,userId:m(r),sourceType:"Internal",employeeName:b,updatedBy:m(r),updatedAt:I(Y.updatedAt,"YYYY-MM-DD HH:mm:ss"),category:null,creationCategory:null,visitTimeFrom:null,visitTimeTo:null,customerName:null,interviewers:[],subject:Y.title,content:"",comments:[],isRead:!0,isStarred:!1,labels:ue,commentItems:[],attachments:[]}}),S=ee(a);S&&h.invalidate(`daily-report:date:${S}:user:${r}`),h.invalidatePrefix(v),h.invalidate(`${fe}:user:${r}`),await D(H),S&&await D(`${R}${S}`);let A=await ge(f.reportHubId,r,{forceRefresh:!0});if(A){let z=await oe(),j=A.labels.some(Y=>z.includes(Y.id));await w(He.parse({type:"report-create",reportHubId:A.reportHubId,report:A,clientTempId:o,recipientRawUserId:j?r:void 0}),"createDailyReport")}return A??f}catch(f){throw V.error("Error in createDailyReport",f),f}},Te=async(r,a)=>await r.select().top(1).from(u).where((0,n.eq)(u.id,a)),Ne=async(r,a,o)=>{await r.update(u).set(o).where((0,n.eq)(u.id,a))},je=async(r,a,o)=>{await r.update(N).set(o).where((0,n.eq)(N.hubId,a))},Ge=async(r,a,o)=>{await r.delete(q).where((0,n.and)((0,n.eq)(q.hubId,a),(0,n.eq)(q.labelId,o)))};return{streamKey:$,streamMaxLen:E,clearCache:async()=>{h.clearAll(),se.clear(),ie=null,O&&await D(H),V.info("[DailyReportService] Server-side DB/SQL caches cleared successfully.")},invalidateHubReadCaches:async(r,a)=>{h.invalidatePrefix(v);for(let o of new Set(r))h.invalidatePrefix(`daily-report:detail:${o}:user:`),await D(`${C}${o}`);for(let o of new Set(a)){let c=ee(o);c&&await D(`${R}${c}`)}},getUserIdByExternalId:re,getDailyReportIdsByExternalId:be,getDailyReportIdsFirstPageByExternalId:T,getDailyReportsByBusinessDate:ye,getDailyReportsByBusinessDateByExternalId:pt,getDailyReportDetailById:ge,getDailyReportDetailByIdByExternalId:yt,getDraftLabelId:xe,getAttachmentsByHubIds:_e,getAttachmentForUser:dt,markAttachmentMissing:ct,markAttachmentPresent:mt,setStarStatus:ht,setReadStatus:ft,addComment:bt,deleteComment:Rt,createDailyReport:Dt,updateDailyReport:async(r,a,o,c)=>{let b=await Te(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 A=>{o.title!==void 0&&await Ne(A,r,{title:o.title,updatedAt:new Date,updatedBy:String(a)}),o.content!==void 0&&await je(A,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(v),await D(`${C}${r}`);let f=ee(I(b[0].businessDate,"YYYY-MM-DD"));f&&(h.invalidatePrefix(`daily-report:date:${f}:user:`),await D(`${R}${f}`));let S=await ge(r,a,{forceRefresh:!0});if(S){let A=await oe(),z=S.labels.some(j=>A.includes(j.id));await w(Ye.parse({type:"report-update",reportHubId:S.reportHubId,report:S,clientTempId:c,recipientRawUserId:z?a:void 0}),"updateDailyReport")}},publishDailyReport:async(r,a,o)=>{let c=await Te(e,r);if(!c.length)throw new Error("Not Found");if(c[0].userId!==a)throw new Error("Unauthorized");let b=await xe();if(!b)return null;if(await Ge(e,r,b),h.invalidatePrefix(`daily-report:detail:${r}:user:`),h.invalidatePrefix(v),h.invalidatePrefix(fe),await D(H),c[0].businessDate){let A=ee(I(c[0].businessDate,"YYYY-MM-DD"));A&&await D(`${R}${A}`)}let f=ee(I(c[0].businessDate,"YYYY-MM-DD"));f&&h.invalidate(`daily-report:date:${f}:user:${a}`);let S=await ge(r,a,{forceRefresh:!0});return S&&await w(Oe.parse({type:"report-publish",reportHubId:S.reportHubId,report:S,clientTempId:o}),"publishDailyReport"),S??null},deleteDailyReport:async(r,a,o)=>{let c=await Te(e,r);if(!c.length||c[0].deletedAt)throw new Error("Not Found");if(c[0].userId!==a)throw new Error("Unauthorized");if(await Ne(e,r,{deletedAt:new Date,deletedBy:String(a),updatedAt:new Date,updatedBy:String(a)}),h.invalidatePrefix(`daily-report:detail:${r}:user:`),h.invalidatePrefix(v),h.invalidatePrefix(fe),await D(H),c[0].businessDate){let b=ee(I(c[0].businessDate,"YYYY-MM-DD"));b&&await D(`${R}${b}`)}await w(qe.parse({type:"report-delete",reportHubId:r,clientTempId:o}),"deleteDailyReport")},findDailyReportHubById:Te,updateDailyReportHub:Ne,updateDailyReportInternal:je,deleteDailyReportLabel:Ge}}var Ie=require("drizzle-orm");function lt(t){let e=[],s=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 s){let m=`daily_report_${i.key.toLowerCase().replace(/[^a-z0-9_]/g,"_")}`;e.push({resourceKey:m,name:i.name,description:i.description??`${i.name} daily report access`}),i.includeCommentResource!==!1&&e.push({resourceKey:`${m}_comment`,name:`${i.name} Comment`,description:`${i.name} daily report comment access`})}return e}async function tr(t,e,s){let i=t,y=e.TMResource,m=s.appKey,M=s.actor??"system:daily-report",h=new Date,O=s.resources??lt(s.sources);for(let u of O){let N=await i.select().from(y).where((0,Ie.and)((0,Ie.eq)(y.appKey,m),(0,Ie.eq)(y.resourceKey,u.resourceKey)));(!N||N.length===0)&&await i.insert(y).values({appKey:m,resourceKey:u.resourceKey,name:u.name,description:u.description??null,createdAt:h,createdBy:M,updatedAt:h,updatedBy:M})}}var rr=ne(1,"[DailyReportExternalSource]"),nr=(t,e,s,i=rr)=>{if(!t)return[];try{let y=JSON.parse(t);return Array.isArray(y)?y.map(s).filter(m=>m!==null):(i.warn(`Unexpected ${e} format: not an array`),[])}catch(y){return i.warn(`Failed to parse ${e}:`,y),[]}};var Se=require("drizzle-orm"),l=require("drizzle-orm/mssql-core");function ar(t,e){let s=(0,l.mssqlSchema)(t),i=e.userTable,y=s.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(Se.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,Se.desc)(p.businessDate),(0,Se.desc)(p.id)),(0,l.index)(`${t}_DailyReportHub_deleted_at_index`).on(p.deletedAt)]),m=s.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]})]),M=s.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=s.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]})]),O=s.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=s.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]})]),N=s.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:m,comment:M,attachment:N,label:h,hubLabel:O,userStatus:u}}function sr(t){let e=$e(t.redis),s=new Re({defaultTtlMs:t.cacheDefaultTtlMs??6e4},e),i=Ke({...t,cache:s,epochs:e}),y=new De({redis:t.redis,streamKey:i.streamKey,cache:s,logger:t.logger}),m=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:y,streamKey:i.streamKey,loginRedirectPath:t.loginRedirectPath,enableDevCacheClear:t.enableDevCacheClear,logger:t.logger});return{service:i,cache:s,epochs:e,sseReader:y,streamKey:i.streamKey,...m}}0&&(module.exports={DailyReportSseReader,SqlResultCache,asciiFallbackFileName,createDailyReportHandlers,createDailyReportServer,createDailyReportService,createEpochStore,defineDailyReportAuthzResources,defineDailyReportSchema,encodeRfc8187,generateETag,isStreamIdLte,jsonResponseWithETag,sanitizeMediaType,seedDailyReportAuthzResources,transformJsonArray});
11
+ `,W=Q!=="0-0"?`id: ${Q}
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});
13
13
  //# sourceMappingURL=server.js.map