@aiquants/daily-report 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/client.d.mts +449 -0
  4. package/dist/client.d.ts +449 -0
  5. package/dist/client.js +7 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/client.mjs +7 -0
  8. package/dist/client.mjs.map +1 -0
  9. package/dist/index.d.mts +42 -0
  10. package/dist/index.d.ts +42 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/index.mjs +2 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/dist/logger-D3krZrNK.d.mts +29 -0
  16. package/dist/logger-D3krZrNK.d.ts +29 -0
  17. package/dist/server.d.mts +1515 -0
  18. package/dist/server.d.ts +1515 -0
  19. package/dist/server.js +10 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/server.mjs +10 -0
  22. package/dist/server.mjs.map +1 -0
  23. package/dist/sse-schema-CK7cUnEo.d.ts +1986 -0
  24. package/dist/sse-schema-yl5AaSsj.d.mts +1986 -0
  25. package/dist/types-CVhwLhSN.d.mts +76 -0
  26. package/dist/types-CVhwLhSN.d.ts +76 -0
  27. package/package.json +108 -0
  28. package/src/client/components/business-day-thumb-overlay.tsx +19 -0
  29. package/src/client/components/daily-report-comment-item.tsx +81 -0
  30. package/src/client/components/daily-report-comment-section.tsx +166 -0
  31. package/src/client/components/daily-report-detail-list.tsx +676 -0
  32. package/src/client/components/daily-report-edit-form.tsx +81 -0
  33. package/src/client/components/daily-report-list.tsx +1024 -0
  34. package/src/client/components/daily-report-page.tsx +147 -0
  35. package/src/client/components/daily-report-resolved-content.tsx +139 -0
  36. package/src/client/components/unread-indicator.tsx +13 -0
  37. package/src/client/config-context.tsx +129 -0
  38. package/src/client/contexts/daily-report-action-context.tsx +910 -0
  39. package/src/client/hooks/use-daily-report-comments.ts +73 -0
  40. package/src/client/hooks/use-daily-report-sse-connection.ts +86 -0
  41. package/src/client/hooks/use-daily-report.spec.ts +155 -0
  42. package/src/client/hooks/use-daily-report.ts +426 -0
  43. package/src/client/hooks/use-dynamic-viewport-height.ts +127 -0
  44. package/src/client/route-helpers.ts +76 -0
  45. package/src/client/ui/button.tsx +42 -0
  46. package/src/client/ui/cn.ts +14 -0
  47. package/src/client/ui/input.tsx +21 -0
  48. package/src/client/ui/label.tsx +16 -0
  49. package/src/client/ui/switch.tsx +19 -0
  50. package/src/client/ui/tabs.tsx +40 -0
  51. package/src/client/ui/textarea.tsx +19 -0
  52. package/src/client/utils/constants.ts +29 -0
  53. package/src/client.ts +21 -0
  54. package/src/index.ts +10 -0
  55. package/src/server/cache.ts +165 -0
  56. package/src/server/etag.ts +18 -0
  57. package/src/server/external-source.ts +60 -0
  58. package/src/server/handlers.ts +543 -0
  59. package/src/server/ports.ts +68 -0
  60. package/src/server/response.ts +37 -0
  61. package/src/server/schema.ts +266 -0
  62. package/src/server/service.spec.ts +97 -0
  63. package/src/server/service.ts +1308 -0
  64. package/src/server/sse-reader.spec.ts +55 -0
  65. package/src/server/sse-reader.ts +223 -0
  66. package/src/server.ts +83 -0
  67. package/src/shared/business-date.spec.ts +61 -0
  68. package/src/shared/business-date.ts +84 -0
  69. package/src/shared/comment-adapter.ts +78 -0
  70. package/src/shared/logger.ts +47 -0
  71. package/src/shared/sse-schema.ts +147 -0
  72. package/src/shared/text-utils.ts +57 -0
  73. package/src/shared/types.ts +76 -0
@@ -0,0 +1,1515 @@
1
+ import { e as DailyReportInterviewer, c as DailyReportComment, D as DailyReportItem, a as DailyReportDetail, d as DailyReportCommentItem } from './types-CVhwLhSN.js';
2
+ import * as drizzle_orm_mssql_core from 'drizzle-orm/mssql-core';
3
+ import { AnyMsSqlColumn } from 'drizzle-orm/mssql-core';
4
+ import { D as DailyReportLogger } from './logger-D3krZrNK.js';
5
+
6
+ /**
7
+ * DI ports (structural interfaces) consumed by the daily-report server layer.
8
+ * daily-report サーバー層が消費する DI ポート (構造的インターフェース) 群。
9
+ *
10
+ * redis / 認証 / ユーザー解決 / ID 難読化はすべてアプリ実装を注入する。
11
+ * redis の型は `redis` パッケージへ依存しないよう、使用する最小面のみ構造定義する。
12
+ */
13
+ /** Redis Stream の 1 エントリ (xRead / xRange の結果要素)。 */
14
+ type RedisStreamMessage = {
15
+ id: string;
16
+ message: Record<string, string>;
17
+ };
18
+ /** 通常操作用 Redis クライアントの最小面 (共有クライアント)。 */
19
+ type DailyReportRedisClient = {
20
+ get(key: string): Promise<string | null>;
21
+ incr(key: string): Promise<number>;
22
+ xAdd(key: string, id: string, message: Record<string, string>, options?: unknown): Promise<string>;
23
+ xRange(key: string, start: string, end: string, options?: {
24
+ COUNT?: number;
25
+ }): Promise<RedisStreamMessage[]>;
26
+ xRevRange(key: string, start: string, end: string, options?: {
27
+ COUNT?: number;
28
+ }): Promise<RedisStreamMessage[]>;
29
+ };
30
+ /** ブロッキング xRead 用 Redis クライアントの最小面 (SSE リーダー専用接続)。 */
31
+ type DailyReportRedisBlockingClient = {
32
+ isOpen: boolean;
33
+ on(event: "error", listener: (err: Error) => void): unknown;
34
+ xRead(streams: Array<{
35
+ key: string;
36
+ id: string;
37
+ }>, options?: {
38
+ BLOCK?: number;
39
+ COUNT?: number;
40
+ }): Promise<Array<{
41
+ name: string;
42
+ messages: RedisStreamMessage[];
43
+ }> | null>;
44
+ quit(): Promise<unknown>;
45
+ };
46
+ /**
47
+ * Redis provider port: shared client for commands + dedicated client factory for blocking reads.
48
+ * Redis プロバイダーポート。コマンド用共有クライアントと、ブロッキング読み取り用専用クライアント生成を提供する。
49
+ */
50
+ type DailyReportRedisProvider = {
51
+ /** 共有クライアントを取得する (未接続・失敗時は undefined)。 */
52
+ getClient(): Promise<DailyReportRedisClient | undefined>;
53
+ /** ブロッキング xRead 用の専用クライアントを生成する (失敗時は undefined)。 */
54
+ createClient(): Promise<DailyReportRedisBlockingClient | undefined>;
55
+ };
56
+ /** 認証結果 (ユーザーは外部 ID を持つ最小形状)。 */
57
+ type DailyReportAuthResult = {
58
+ user?: {
59
+ id: string;
60
+ };
61
+ cookie?: string;
62
+ };
63
+ /**
64
+ * Request authentication port (e.g. session/OpenID check in the host app).
65
+ * リクエスト認証ポート (ホストアプリのセッション / OpenID 検証)。
66
+ *
67
+ * `failureRedirect` が文字列の場合、未認証時は実装側で redirect を throw すること。
68
+ * null の場合は throw せず `user` 無しで解決する。
69
+ */
70
+ type DailyReportAuthenticate = (request: Request, options: {
71
+ failureRedirect: string;
72
+ } | {
73
+ failureRedirect: null;
74
+ }) => Promise<DailyReportAuthResult>;
75
+ /**
76
+ * Resolves an external user id (e.g. Google sub) to the internal numeric user id.
77
+ * 外部ユーザー ID (例: Google sub) を内部数値ユーザー ID へ解決するポート。
78
+ */
79
+ type DailyReportResolveUserId = (externalUserId: string) => Promise<number | null>;
80
+ /**
81
+ * Obfuscates an internal numeric user id for client exposure.
82
+ * 内部数値ユーザー ID をクライアント公開用に難読化するポート。
83
+ */
84
+ type DailyReportEncodeUserId = (id: number) => string;
85
+
86
+ /**
87
+ * In-memory SQL result cache with TTL, snapshot, and cross-worker epoch (via redis) support.
88
+ * TTL・スナップショット・クロスワーカー epoch (redis 経由) を備えた SQL 結果のインメモリキャッシュ。
89
+ *
90
+ * epoch は任意注入の redis ポート経由で取得・更新する (未注入時は常に 0 = epoch 無効)。
91
+ */
92
+
93
+ type SqlResultCacheQueryOptions = {
94
+ forceRefresh?: boolean;
95
+ snapshot?: boolean;
96
+ ttlMsOverride?: number;
97
+ epochKey?: string;
98
+ };
99
+ /**
100
+ * Creates epoch helpers bound to an optional redis provider.
101
+ * 任意の redis プロバイダーに束縛された epoch ヘルパーを生成する処理。
102
+ */
103
+ declare const createEpochStore: (redis?: DailyReportRedisProvider) => {
104
+ /**
105
+ * Gets the current epoch value from Redis.
106
+ * Redis からエポック値を取得する。エラー時は 0 を返す (常に re-fetch = safe 方向)。
107
+ */
108
+ getEpoch(epochKey: string): Promise<number>;
109
+ /**
110
+ * Increments the epoch counter in Redis.
111
+ * Redis のエポックカウンターをインクリメントする。
112
+ */
113
+ incrementEpoch(epochKey: string): Promise<void>;
114
+ };
115
+ type EpochStore = ReturnType<typeof createEpochStore>;
116
+ /**
117
+ * In-memory cache for SQL query results with TTL and snapshot support.
118
+ * TTLとスナップショット機能を備えたSQLクエリ結果のインメモリキャッシュ。
119
+ */
120
+ declare class SqlResultCache {
121
+ private readonly config;
122
+ private readonly epochStore;
123
+ private readonly buckets;
124
+ private readonly inFlight;
125
+ constructor(config: {
126
+ defaultTtlMs: number;
127
+ }, epochStore: EpochStore);
128
+ /**
129
+ * Invalidates a specific cache bucket.
130
+ * 指定されたキャッシュバケットを無効化します。
131
+ */
132
+ invalidate: (cacheKey: string) => void;
133
+ /**
134
+ * Retrieves records from cache or fetches them if expired/missing.
135
+ * キャッシュからレコードを取得するか、期限切れや未存在の場合はフェッチします。
136
+ */
137
+ getOrFetch: <T>(opts: {
138
+ cacheKey: string;
139
+ fetcher: () => Promise<readonly T[]>;
140
+ } & SqlResultCacheQueryOptions) => Promise<readonly T[]>;
141
+ /**
142
+ * Clears the cache for a specific key.
143
+ * 指定されたキーのキャッシュをクリアします。
144
+ */
145
+ flush: (cacheKey: string) => void;
146
+ /**
147
+ * Invalidates cache buckets matching a prefix.
148
+ * 指定されたプレフィックスに一致するキャッシュバケットを無効化します。
149
+ */
150
+ invalidatePrefix: (prefix: string) => void;
151
+ }
152
+
153
+ /**
154
+ * External source adapter contract for legacy/foreign daily-report tables.
155
+ * レガシー・外部由来の日報テーブルを取り込む外部ソースアダプタ契約。
156
+ *
157
+ * DailyReportHub.source_type がアダプタの `sourceType` に一致する行は、
158
+ * `table` を `Hub.source_id_num = idColumn` で LEFT JOIN し、その行を
159
+ * `mapRow` で表示フィールドへ変換する (例: 別システムのレガシー日報テーブルの取り込み)。
160
+ */
161
+
162
+ /** 外部ソース行から詳細表示へ供給するフィールド群。 */
163
+ type ExternalReportFields = {
164
+ content?: string | null;
165
+ employeeName?: string | null;
166
+ category?: string | null;
167
+ creationCategory?: string | null;
168
+ visitTimeFrom?: string | null;
169
+ visitTimeTo?: string | null;
170
+ customerName?: string | null;
171
+ interviewers?: DailyReportInterviewer[];
172
+ comments?: DailyReportComment[];
173
+ };
174
+ /** 外部ソースアダプタ。 */
175
+ type DailyReportExternalSource = {
176
+ /** DailyReportHub.source_type の一致値 (例 "legacy")。 */
177
+ sourceType: string;
178
+ /** LEFT JOIN する drizzle テーブル。 */
179
+ table: unknown;
180
+ /** Hub.source_id_num と突き合わせる ID 列。 */
181
+ idColumn: AnyMsSqlColumn;
182
+ /** 結合行を表示フィールドへ変換する処理。 */
183
+ mapRow: (row: Record<string, unknown>) => ExternalReportFields;
184
+ };
185
+ /**
186
+ * Parses JSON array payloads and maps each element (fail-soft: returns [] on error).
187
+ * JSON 配列のペイロードを解析し各要素を変換する処理 (エラー時は空配列)。
188
+ */
189
+ declare const transformJsonArray: <TRaw, TResult>(payload: string | null, label: string, mapper: (raw: TRaw) => TResult | null, logger?: DailyReportLogger) => TResult[];
190
+
191
+ /** 注入する外部ユーザーテーブルの最小形 (id / display_name)。 */
192
+ type DailyReportUserTable = {
193
+ id: AnyMsSqlColumn;
194
+ displayName: AnyMsSqlColumn;
195
+ };
196
+ /** DailyReportHub テーブルの構造形。 */
197
+ type DailyReportHubTable = {
198
+ id: AnyMsSqlColumn;
199
+ sourceType: AnyMsSqlColumn;
200
+ sourceId: AnyMsSqlColumn;
201
+ sourceIdNum: AnyMsSqlColumn;
202
+ businessDate: AnyMsSqlColumn;
203
+ userId: AnyMsSqlColumn;
204
+ title: AnyMsSqlColumn;
205
+ summary: AnyMsSqlColumn;
206
+ createdAt: AnyMsSqlColumn;
207
+ createdBy: AnyMsSqlColumn;
208
+ updatedAt: AnyMsSqlColumn;
209
+ updatedBy: AnyMsSqlColumn;
210
+ deletedAt: AnyMsSqlColumn;
211
+ deletedBy: AnyMsSqlColumn;
212
+ };
213
+ /** DailyReportInternal テーブルの構造形。 */
214
+ type DailyReportInternalTable = {
215
+ hubId: AnyMsSqlColumn;
216
+ body: AnyMsSqlColumn;
217
+ metadata: AnyMsSqlColumn;
218
+ createdAt: AnyMsSqlColumn;
219
+ createdBy: AnyMsSqlColumn;
220
+ updatedAt: AnyMsSqlColumn;
221
+ updatedBy: AnyMsSqlColumn;
222
+ };
223
+ /** DailyReportComment テーブルの構造形。 */
224
+ type DailyReportCommentTable = {
225
+ id: AnyMsSqlColumn;
226
+ hubId: AnyMsSqlColumn;
227
+ userId: AnyMsSqlColumn;
228
+ body: AnyMsSqlColumn;
229
+ createdAt: AnyMsSqlColumn;
230
+ createdBy: AnyMsSqlColumn;
231
+ updatedAt: AnyMsSqlColumn;
232
+ updatedBy: AnyMsSqlColumn;
233
+ };
234
+ /** DailyReportLabel テーブルの構造形。 */
235
+ type DailyReportLabelTable = {
236
+ id: AnyMsSqlColumn;
237
+ userId: AnyMsSqlColumn;
238
+ name: AnyMsSqlColumn;
239
+ color: AnyMsSqlColumn;
240
+ sortOrder: AnyMsSqlColumn;
241
+ createdAt: AnyMsSqlColumn;
242
+ createdBy: AnyMsSqlColumn;
243
+ updatedAt: AnyMsSqlColumn;
244
+ updatedBy: AnyMsSqlColumn;
245
+ };
246
+ /** DailyReportHub_Label 中間テーブルの構造形。 */
247
+ type DailyReportHubLabelTable = {
248
+ hubId: AnyMsSqlColumn;
249
+ labelId: AnyMsSqlColumn;
250
+ createdAt: AnyMsSqlColumn;
251
+ createdBy: AnyMsSqlColumn;
252
+ };
253
+ /** DailyReportUserStatus テーブルの構造形。 */
254
+ type DailyReportUserStatusTable = {
255
+ hubId: AnyMsSqlColumn;
256
+ userId: AnyMsSqlColumn;
257
+ isRead: AnyMsSqlColumn;
258
+ isStarred: AnyMsSqlColumn;
259
+ createdAt: AnyMsSqlColumn;
260
+ createdBy: AnyMsSqlColumn;
261
+ updatedAt: AnyMsSqlColumn;
262
+ updatedBy: AnyMsSqlColumn;
263
+ };
264
+ /** サービスへ注入するテーブル一式 (アプリ既存モデルまたは本ファクトリ生成物)。 */
265
+ type DailyReportTables = {
266
+ hub: DailyReportHubTable;
267
+ internal: DailyReportInternalTable;
268
+ comment: DailyReportCommentTable;
269
+ label: DailyReportLabelTable;
270
+ hubLabel: DailyReportHubLabelTable;
271
+ userStatus: DailyReportUserStatusTable;
272
+ };
273
+ /**
274
+ * Generic factory: build the six daily-report tables under an arbitrary schema name.
275
+ * 任意のスキーマ名の下に日報 6 テーブルを生成する汎用ファクトリ。
276
+ *
277
+ * 制約・索引名は `${schemaName}_<Table>_...` 規約で生成する。
278
+ * ユーザーテーブルへの FK は注入された `userTable` を参照する。
279
+ */
280
+ declare function defineDailyReportSchema<S extends string>(schemaName: S, opts: {
281
+ userTable: DailyReportUserTable;
282
+ }): {
283
+ hub: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
284
+ name: "DailyReportHub";
285
+ schema: S;
286
+ columns: {
287
+ id: drizzle_orm_mssql_core.MsSqlColumn<{
288
+ name: string;
289
+ tableName: "DailyReportHub";
290
+ dataType: "number int53";
291
+ data: number;
292
+ driverParam: string;
293
+ notNull: true;
294
+ hasDefault: true;
295
+ isPrimaryKey: false;
296
+ isAutoincrement: false;
297
+ hasRuntimeDefault: false;
298
+ enumValues: undefined;
299
+ baseColumn: never;
300
+ identity: undefined;
301
+ generated: {};
302
+ }, {}>;
303
+ sourceType: drizzle_orm_mssql_core.MsSqlColumn<{
304
+ name: string;
305
+ tableName: "DailyReportHub";
306
+ dataType: "string";
307
+ data: string;
308
+ driverParam: string | number;
309
+ notNull: true;
310
+ hasDefault: false;
311
+ isPrimaryKey: false;
312
+ isAutoincrement: false;
313
+ hasRuntimeDefault: false;
314
+ enumValues: [string, ...string[]];
315
+ baseColumn: never;
316
+ identity: undefined;
317
+ generated: undefined;
318
+ }, {}>;
319
+ sourceId: drizzle_orm_mssql_core.MsSqlColumn<{
320
+ name: string;
321
+ tableName: "DailyReportHub";
322
+ dataType: "string";
323
+ data: string;
324
+ driverParam: string | number;
325
+ notNull: true;
326
+ hasDefault: false;
327
+ isPrimaryKey: false;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: [string, ...string[]];
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}>;
335
+ sourceIdNum: drizzle_orm_mssql_core.MsSqlColumn<{
336
+ name: string;
337
+ tableName: "DailyReportHub";
338
+ dataType: "number int53";
339
+ data: number;
340
+ driverParam: string;
341
+ notNull: false;
342
+ hasDefault: true;
343
+ isPrimaryKey: false;
344
+ isAutoincrement: false;
345
+ hasRuntimeDefault: false;
346
+ enumValues: undefined;
347
+ baseColumn: never;
348
+ identity: undefined;
349
+ generated: {
350
+ type: "always";
351
+ };
352
+ }, {}>;
353
+ businessDate: drizzle_orm_mssql_core.MsSqlColumn<{
354
+ name: string;
355
+ tableName: "DailyReportHub";
356
+ dataType: "object date";
357
+ data: Date;
358
+ driverParam: string | number;
359
+ notNull: false;
360
+ hasDefault: false;
361
+ isPrimaryKey: false;
362
+ isAutoincrement: false;
363
+ hasRuntimeDefault: false;
364
+ enumValues: undefined;
365
+ baseColumn: never;
366
+ identity: undefined;
367
+ generated: undefined;
368
+ }, {}>;
369
+ userId: drizzle_orm_mssql_core.MsSqlColumn<{
370
+ name: string;
371
+ tableName: "DailyReportHub";
372
+ dataType: "number int53";
373
+ data: number;
374
+ driverParam: string;
375
+ notNull: false;
376
+ hasDefault: false;
377
+ isPrimaryKey: false;
378
+ isAutoincrement: false;
379
+ hasRuntimeDefault: false;
380
+ enumValues: undefined;
381
+ baseColumn: never;
382
+ identity: undefined;
383
+ generated: undefined;
384
+ }, {}>;
385
+ title: drizzle_orm_mssql_core.MsSqlColumn<{
386
+ name: string;
387
+ tableName: "DailyReportHub";
388
+ dataType: "string";
389
+ data: string;
390
+ driverParam: string | number;
391
+ notNull: false;
392
+ hasDefault: false;
393
+ isPrimaryKey: false;
394
+ isAutoincrement: false;
395
+ hasRuntimeDefault: false;
396
+ enumValues: [string, ...string[]];
397
+ baseColumn: never;
398
+ identity: undefined;
399
+ generated: undefined;
400
+ }, {}>;
401
+ summary: drizzle_orm_mssql_core.MsSqlColumn<{
402
+ name: string;
403
+ tableName: "DailyReportHub";
404
+ dataType: "string";
405
+ data: string;
406
+ driverParam: string | number;
407
+ notNull: false;
408
+ hasDefault: false;
409
+ isPrimaryKey: false;
410
+ isAutoincrement: false;
411
+ hasRuntimeDefault: false;
412
+ enumValues: [string, ...string[]];
413
+ baseColumn: never;
414
+ identity: undefined;
415
+ generated: undefined;
416
+ }, {}>;
417
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
418
+ name: string;
419
+ tableName: "DailyReportHub";
420
+ dataType: "object date";
421
+ data: Date;
422
+ driverParam: string | Date;
423
+ notNull: true;
424
+ hasDefault: false;
425
+ isPrimaryKey: false;
426
+ isAutoincrement: false;
427
+ hasRuntimeDefault: false;
428
+ enumValues: undefined;
429
+ baseColumn: never;
430
+ identity: undefined;
431
+ generated: undefined;
432
+ }, {}>;
433
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
434
+ name: string;
435
+ tableName: "DailyReportHub";
436
+ dataType: "string";
437
+ data: string;
438
+ driverParam: string | number;
439
+ notNull: true;
440
+ hasDefault: false;
441
+ isPrimaryKey: false;
442
+ isAutoincrement: false;
443
+ hasRuntimeDefault: false;
444
+ enumValues: [string, ...string[]];
445
+ baseColumn: never;
446
+ identity: undefined;
447
+ generated: undefined;
448
+ }, {}>;
449
+ updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
450
+ name: string;
451
+ tableName: "DailyReportHub";
452
+ dataType: "object date";
453
+ data: Date;
454
+ driverParam: string | Date;
455
+ notNull: true;
456
+ hasDefault: false;
457
+ isPrimaryKey: false;
458
+ isAutoincrement: false;
459
+ hasRuntimeDefault: false;
460
+ enumValues: undefined;
461
+ baseColumn: never;
462
+ identity: undefined;
463
+ generated: undefined;
464
+ }, {}>;
465
+ updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
466
+ name: string;
467
+ tableName: "DailyReportHub";
468
+ dataType: "string";
469
+ data: string;
470
+ driverParam: string | number;
471
+ notNull: true;
472
+ hasDefault: false;
473
+ isPrimaryKey: false;
474
+ isAutoincrement: false;
475
+ hasRuntimeDefault: false;
476
+ enumValues: [string, ...string[]];
477
+ baseColumn: never;
478
+ identity: undefined;
479
+ generated: undefined;
480
+ }, {}>;
481
+ deletedAt: drizzle_orm_mssql_core.MsSqlColumn<{
482
+ name: string;
483
+ tableName: "DailyReportHub";
484
+ dataType: "object date";
485
+ data: Date;
486
+ driverParam: string | Date;
487
+ notNull: false;
488
+ hasDefault: false;
489
+ isPrimaryKey: false;
490
+ isAutoincrement: false;
491
+ hasRuntimeDefault: false;
492
+ enumValues: undefined;
493
+ baseColumn: never;
494
+ identity: undefined;
495
+ generated: undefined;
496
+ }, {}>;
497
+ deletedBy: drizzle_orm_mssql_core.MsSqlColumn<{
498
+ name: string;
499
+ tableName: "DailyReportHub";
500
+ dataType: "string";
501
+ data: string;
502
+ driverParam: string | number;
503
+ notNull: false;
504
+ hasDefault: false;
505
+ isPrimaryKey: false;
506
+ isAutoincrement: false;
507
+ hasRuntimeDefault: false;
508
+ enumValues: [string, ...string[]];
509
+ baseColumn: never;
510
+ identity: undefined;
511
+ generated: undefined;
512
+ }, {}>;
513
+ };
514
+ dialect: "mssql";
515
+ }>;
516
+ internal: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
517
+ name: "DailyReportInternal";
518
+ schema: S;
519
+ columns: {
520
+ hubId: drizzle_orm_mssql_core.MsSqlColumn<{
521
+ name: string;
522
+ tableName: "DailyReportInternal";
523
+ dataType: "number int53";
524
+ data: number;
525
+ driverParam: string;
526
+ notNull: true;
527
+ hasDefault: false;
528
+ isPrimaryKey: false;
529
+ isAutoincrement: false;
530
+ hasRuntimeDefault: false;
531
+ enumValues: undefined;
532
+ baseColumn: never;
533
+ identity: undefined;
534
+ generated: undefined;
535
+ }, {}>;
536
+ body: drizzle_orm_mssql_core.MsSqlColumn<{
537
+ name: string;
538
+ tableName: "DailyReportInternal";
539
+ dataType: "string";
540
+ data: string;
541
+ driverParam: string | number;
542
+ notNull: false;
543
+ hasDefault: false;
544
+ isPrimaryKey: false;
545
+ isAutoincrement: false;
546
+ hasRuntimeDefault: false;
547
+ enumValues: [string, ...string[]];
548
+ baseColumn: never;
549
+ identity: undefined;
550
+ generated: undefined;
551
+ }, {}>;
552
+ metadata: drizzle_orm_mssql_core.MsSqlColumn<{
553
+ name: string;
554
+ tableName: "DailyReportInternal";
555
+ dataType: "string";
556
+ data: string;
557
+ driverParam: string | number;
558
+ notNull: false;
559
+ hasDefault: false;
560
+ isPrimaryKey: false;
561
+ isAutoincrement: false;
562
+ hasRuntimeDefault: false;
563
+ enumValues: [string, ...string[]];
564
+ baseColumn: never;
565
+ identity: undefined;
566
+ generated: undefined;
567
+ }, {}>;
568
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
569
+ name: string;
570
+ tableName: "DailyReportInternal";
571
+ dataType: "object date";
572
+ data: Date;
573
+ driverParam: string | Date;
574
+ notNull: true;
575
+ hasDefault: false;
576
+ isPrimaryKey: false;
577
+ isAutoincrement: false;
578
+ hasRuntimeDefault: false;
579
+ enumValues: undefined;
580
+ baseColumn: never;
581
+ identity: undefined;
582
+ generated: undefined;
583
+ }, {}>;
584
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
585
+ name: string;
586
+ tableName: "DailyReportInternal";
587
+ dataType: "string";
588
+ data: string;
589
+ driverParam: string | number;
590
+ notNull: true;
591
+ hasDefault: false;
592
+ isPrimaryKey: false;
593
+ isAutoincrement: false;
594
+ hasRuntimeDefault: false;
595
+ enumValues: [string, ...string[]];
596
+ baseColumn: never;
597
+ identity: undefined;
598
+ generated: undefined;
599
+ }, {}>;
600
+ updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
601
+ name: string;
602
+ tableName: "DailyReportInternal";
603
+ dataType: "object date";
604
+ data: Date;
605
+ driverParam: string | Date;
606
+ notNull: true;
607
+ hasDefault: false;
608
+ isPrimaryKey: false;
609
+ isAutoincrement: false;
610
+ hasRuntimeDefault: false;
611
+ enumValues: undefined;
612
+ baseColumn: never;
613
+ identity: undefined;
614
+ generated: undefined;
615
+ }, {}>;
616
+ updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
617
+ name: string;
618
+ tableName: "DailyReportInternal";
619
+ dataType: "string";
620
+ data: string;
621
+ driverParam: string | number;
622
+ notNull: true;
623
+ hasDefault: false;
624
+ isPrimaryKey: false;
625
+ isAutoincrement: false;
626
+ hasRuntimeDefault: false;
627
+ enumValues: [string, ...string[]];
628
+ baseColumn: never;
629
+ identity: undefined;
630
+ generated: undefined;
631
+ }, {}>;
632
+ };
633
+ dialect: "mssql";
634
+ }>;
635
+ comment: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
636
+ name: "DailyReportComment";
637
+ schema: S;
638
+ columns: {
639
+ id: drizzle_orm_mssql_core.MsSqlColumn<{
640
+ name: string;
641
+ tableName: "DailyReportComment";
642
+ dataType: "number int53";
643
+ data: number;
644
+ driverParam: string;
645
+ notNull: true;
646
+ hasDefault: true;
647
+ isPrimaryKey: false;
648
+ isAutoincrement: false;
649
+ hasRuntimeDefault: false;
650
+ enumValues: undefined;
651
+ baseColumn: never;
652
+ identity: undefined;
653
+ generated: {};
654
+ }, {}>;
655
+ hubId: drizzle_orm_mssql_core.MsSqlColumn<{
656
+ name: string;
657
+ tableName: "DailyReportComment";
658
+ dataType: "number int53";
659
+ data: number;
660
+ driverParam: string;
661
+ notNull: true;
662
+ hasDefault: false;
663
+ isPrimaryKey: false;
664
+ isAutoincrement: false;
665
+ hasRuntimeDefault: false;
666
+ enumValues: undefined;
667
+ baseColumn: never;
668
+ identity: undefined;
669
+ generated: undefined;
670
+ }, {}>;
671
+ userId: drizzle_orm_mssql_core.MsSqlColumn<{
672
+ name: string;
673
+ tableName: "DailyReportComment";
674
+ dataType: "number int53";
675
+ data: number;
676
+ driverParam: string;
677
+ notNull: true;
678
+ hasDefault: false;
679
+ isPrimaryKey: false;
680
+ isAutoincrement: false;
681
+ hasRuntimeDefault: false;
682
+ enumValues: undefined;
683
+ baseColumn: never;
684
+ identity: undefined;
685
+ generated: undefined;
686
+ }, {}>;
687
+ body: drizzle_orm_mssql_core.MsSqlColumn<{
688
+ name: string;
689
+ tableName: "DailyReportComment";
690
+ dataType: "string";
691
+ data: string;
692
+ driverParam: string | number;
693
+ notNull: true;
694
+ hasDefault: false;
695
+ isPrimaryKey: false;
696
+ isAutoincrement: false;
697
+ hasRuntimeDefault: false;
698
+ enumValues: [string, ...string[]];
699
+ baseColumn: never;
700
+ identity: undefined;
701
+ generated: undefined;
702
+ }, {}>;
703
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
704
+ name: string;
705
+ tableName: "DailyReportComment";
706
+ dataType: "object date";
707
+ data: Date;
708
+ driverParam: string | Date;
709
+ notNull: true;
710
+ hasDefault: false;
711
+ isPrimaryKey: false;
712
+ isAutoincrement: false;
713
+ hasRuntimeDefault: false;
714
+ enumValues: undefined;
715
+ baseColumn: never;
716
+ identity: undefined;
717
+ generated: undefined;
718
+ }, {}>;
719
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
720
+ name: string;
721
+ tableName: "DailyReportComment";
722
+ dataType: "string";
723
+ data: string;
724
+ driverParam: string | number;
725
+ notNull: true;
726
+ hasDefault: false;
727
+ isPrimaryKey: false;
728
+ isAutoincrement: false;
729
+ hasRuntimeDefault: false;
730
+ enumValues: [string, ...string[]];
731
+ baseColumn: never;
732
+ identity: undefined;
733
+ generated: undefined;
734
+ }, {}>;
735
+ updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
736
+ name: string;
737
+ tableName: "DailyReportComment";
738
+ dataType: "object date";
739
+ data: Date;
740
+ driverParam: string | Date;
741
+ notNull: true;
742
+ hasDefault: false;
743
+ isPrimaryKey: false;
744
+ isAutoincrement: false;
745
+ hasRuntimeDefault: false;
746
+ enumValues: undefined;
747
+ baseColumn: never;
748
+ identity: undefined;
749
+ generated: undefined;
750
+ }, {}>;
751
+ updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
752
+ name: string;
753
+ tableName: "DailyReportComment";
754
+ dataType: "string";
755
+ data: string;
756
+ driverParam: string | number;
757
+ notNull: true;
758
+ hasDefault: false;
759
+ isPrimaryKey: false;
760
+ isAutoincrement: false;
761
+ hasRuntimeDefault: false;
762
+ enumValues: [string, ...string[]];
763
+ baseColumn: never;
764
+ identity: undefined;
765
+ generated: undefined;
766
+ }, {}>;
767
+ };
768
+ dialect: "mssql";
769
+ }>;
770
+ label: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
771
+ name: "DailyReportLabel";
772
+ schema: S;
773
+ columns: {
774
+ id: drizzle_orm_mssql_core.MsSqlColumn<{
775
+ name: string;
776
+ tableName: "DailyReportLabel";
777
+ dataType: "number int53";
778
+ data: number;
779
+ driverParam: string;
780
+ notNull: true;
781
+ hasDefault: true;
782
+ isPrimaryKey: false;
783
+ isAutoincrement: false;
784
+ hasRuntimeDefault: false;
785
+ enumValues: undefined;
786
+ baseColumn: never;
787
+ identity: undefined;
788
+ generated: {};
789
+ }, {}>;
790
+ userId: drizzle_orm_mssql_core.MsSqlColumn<{
791
+ name: string;
792
+ tableName: "DailyReportLabel";
793
+ dataType: "number int53";
794
+ data: number;
795
+ driverParam: string;
796
+ notNull: false;
797
+ hasDefault: false;
798
+ isPrimaryKey: false;
799
+ isAutoincrement: false;
800
+ hasRuntimeDefault: false;
801
+ enumValues: undefined;
802
+ baseColumn: never;
803
+ identity: undefined;
804
+ generated: undefined;
805
+ }, {}>;
806
+ name: drizzle_orm_mssql_core.MsSqlColumn<{
807
+ name: string;
808
+ tableName: "DailyReportLabel";
809
+ dataType: "string";
810
+ data: string;
811
+ driverParam: string | number;
812
+ notNull: true;
813
+ hasDefault: false;
814
+ isPrimaryKey: false;
815
+ isAutoincrement: false;
816
+ hasRuntimeDefault: false;
817
+ enumValues: [string, ...string[]];
818
+ baseColumn: never;
819
+ identity: undefined;
820
+ generated: undefined;
821
+ }, {}>;
822
+ color: drizzle_orm_mssql_core.MsSqlColumn<{
823
+ name: string;
824
+ tableName: "DailyReportLabel";
825
+ dataType: "string";
826
+ data: string;
827
+ driverParam: string | number;
828
+ notNull: false;
829
+ hasDefault: false;
830
+ isPrimaryKey: false;
831
+ isAutoincrement: false;
832
+ hasRuntimeDefault: false;
833
+ enumValues: [string, ...string[]];
834
+ baseColumn: never;
835
+ identity: undefined;
836
+ generated: undefined;
837
+ }, {}>;
838
+ sortOrder: drizzle_orm_mssql_core.MsSqlColumn<{
839
+ name: string;
840
+ tableName: "DailyReportLabel";
841
+ dataType: "number int32";
842
+ data: number;
843
+ driverParam: number;
844
+ notNull: false;
845
+ hasDefault: false;
846
+ isPrimaryKey: false;
847
+ isAutoincrement: false;
848
+ hasRuntimeDefault: false;
849
+ enumValues: undefined;
850
+ baseColumn: never;
851
+ identity: undefined;
852
+ generated: undefined;
853
+ }, {}>;
854
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
855
+ name: string;
856
+ tableName: "DailyReportLabel";
857
+ dataType: "object date";
858
+ data: Date;
859
+ driverParam: string | Date;
860
+ notNull: true;
861
+ hasDefault: false;
862
+ isPrimaryKey: false;
863
+ isAutoincrement: false;
864
+ hasRuntimeDefault: false;
865
+ enumValues: undefined;
866
+ baseColumn: never;
867
+ identity: undefined;
868
+ generated: undefined;
869
+ }, {}>;
870
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
871
+ name: string;
872
+ tableName: "DailyReportLabel";
873
+ dataType: "string";
874
+ data: string;
875
+ driverParam: string | number;
876
+ notNull: true;
877
+ hasDefault: false;
878
+ isPrimaryKey: false;
879
+ isAutoincrement: false;
880
+ hasRuntimeDefault: false;
881
+ enumValues: [string, ...string[]];
882
+ baseColumn: never;
883
+ identity: undefined;
884
+ generated: undefined;
885
+ }, {}>;
886
+ updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
887
+ name: string;
888
+ tableName: "DailyReportLabel";
889
+ dataType: "object date";
890
+ data: Date;
891
+ driverParam: string | Date;
892
+ notNull: true;
893
+ hasDefault: false;
894
+ isPrimaryKey: false;
895
+ isAutoincrement: false;
896
+ hasRuntimeDefault: false;
897
+ enumValues: undefined;
898
+ baseColumn: never;
899
+ identity: undefined;
900
+ generated: undefined;
901
+ }, {}>;
902
+ updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
903
+ name: string;
904
+ tableName: "DailyReportLabel";
905
+ dataType: "string";
906
+ data: string;
907
+ driverParam: string | number;
908
+ notNull: true;
909
+ hasDefault: false;
910
+ isPrimaryKey: false;
911
+ isAutoincrement: false;
912
+ hasRuntimeDefault: false;
913
+ enumValues: [string, ...string[]];
914
+ baseColumn: never;
915
+ identity: undefined;
916
+ generated: undefined;
917
+ }, {}>;
918
+ };
919
+ dialect: "mssql";
920
+ }>;
921
+ hubLabel: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
922
+ name: "DailyReportHub_Label";
923
+ schema: S;
924
+ columns: {
925
+ hubId: drizzle_orm_mssql_core.MsSqlColumn<{
926
+ name: string;
927
+ tableName: "DailyReportHub_Label";
928
+ dataType: "number int53";
929
+ data: number;
930
+ driverParam: string;
931
+ notNull: true;
932
+ hasDefault: false;
933
+ isPrimaryKey: false;
934
+ isAutoincrement: false;
935
+ hasRuntimeDefault: false;
936
+ enumValues: undefined;
937
+ baseColumn: never;
938
+ identity: undefined;
939
+ generated: undefined;
940
+ }, {}>;
941
+ labelId: drizzle_orm_mssql_core.MsSqlColumn<{
942
+ name: string;
943
+ tableName: "DailyReportHub_Label";
944
+ dataType: "number int53";
945
+ data: number;
946
+ driverParam: string;
947
+ notNull: true;
948
+ hasDefault: false;
949
+ isPrimaryKey: false;
950
+ isAutoincrement: false;
951
+ hasRuntimeDefault: false;
952
+ enumValues: undefined;
953
+ baseColumn: never;
954
+ identity: undefined;
955
+ generated: undefined;
956
+ }, {}>;
957
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
958
+ name: string;
959
+ tableName: "DailyReportHub_Label";
960
+ dataType: "object date";
961
+ data: Date;
962
+ driverParam: string | Date;
963
+ notNull: true;
964
+ hasDefault: false;
965
+ isPrimaryKey: false;
966
+ isAutoincrement: false;
967
+ hasRuntimeDefault: false;
968
+ enumValues: undefined;
969
+ baseColumn: never;
970
+ identity: undefined;
971
+ generated: undefined;
972
+ }, {}>;
973
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
974
+ name: string;
975
+ tableName: "DailyReportHub_Label";
976
+ dataType: "string";
977
+ data: string;
978
+ driverParam: string | number;
979
+ notNull: true;
980
+ hasDefault: false;
981
+ isPrimaryKey: false;
982
+ isAutoincrement: false;
983
+ hasRuntimeDefault: false;
984
+ enumValues: [string, ...string[]];
985
+ baseColumn: never;
986
+ identity: undefined;
987
+ generated: undefined;
988
+ }, {}>;
989
+ };
990
+ dialect: "mssql";
991
+ }>;
992
+ userStatus: drizzle_orm_mssql_core.MsSqlTableWithColumns<{
993
+ name: "DailyReportUserStatus";
994
+ schema: S;
995
+ columns: {
996
+ hubId: drizzle_orm_mssql_core.MsSqlColumn<{
997
+ name: string;
998
+ tableName: "DailyReportUserStatus";
999
+ dataType: "number int53";
1000
+ data: number;
1001
+ driverParam: string;
1002
+ notNull: true;
1003
+ hasDefault: false;
1004
+ isPrimaryKey: false;
1005
+ isAutoincrement: false;
1006
+ hasRuntimeDefault: false;
1007
+ enumValues: undefined;
1008
+ baseColumn: never;
1009
+ identity: undefined;
1010
+ generated: undefined;
1011
+ }, {}>;
1012
+ userId: drizzle_orm_mssql_core.MsSqlColumn<{
1013
+ name: string;
1014
+ tableName: "DailyReportUserStatus";
1015
+ dataType: "number int53";
1016
+ data: number;
1017
+ driverParam: string;
1018
+ notNull: true;
1019
+ hasDefault: false;
1020
+ isPrimaryKey: false;
1021
+ isAutoincrement: false;
1022
+ hasRuntimeDefault: false;
1023
+ enumValues: undefined;
1024
+ baseColumn: never;
1025
+ identity: undefined;
1026
+ generated: undefined;
1027
+ }, {}>;
1028
+ isRead: drizzle_orm_mssql_core.MsSqlColumn<{
1029
+ name: string;
1030
+ tableName: "DailyReportUserStatus";
1031
+ dataType: "boolean";
1032
+ data: boolean;
1033
+ driverParam: string | number;
1034
+ notNull: true;
1035
+ hasDefault: true;
1036
+ isPrimaryKey: false;
1037
+ isAutoincrement: false;
1038
+ hasRuntimeDefault: false;
1039
+ enumValues: undefined;
1040
+ baseColumn: never;
1041
+ identity: undefined;
1042
+ generated: undefined;
1043
+ }, {}>;
1044
+ isStarred: drizzle_orm_mssql_core.MsSqlColumn<{
1045
+ name: string;
1046
+ tableName: "DailyReportUserStatus";
1047
+ dataType: "boolean";
1048
+ data: boolean;
1049
+ driverParam: string | number;
1050
+ notNull: true;
1051
+ hasDefault: true;
1052
+ isPrimaryKey: false;
1053
+ isAutoincrement: false;
1054
+ hasRuntimeDefault: false;
1055
+ enumValues: undefined;
1056
+ baseColumn: never;
1057
+ identity: undefined;
1058
+ generated: undefined;
1059
+ }, {}>;
1060
+ createdAt: drizzle_orm_mssql_core.MsSqlColumn<{
1061
+ name: string;
1062
+ tableName: "DailyReportUserStatus";
1063
+ dataType: "object date";
1064
+ data: Date;
1065
+ driverParam: string | Date;
1066
+ notNull: true;
1067
+ hasDefault: false;
1068
+ isPrimaryKey: false;
1069
+ isAutoincrement: false;
1070
+ hasRuntimeDefault: false;
1071
+ enumValues: undefined;
1072
+ baseColumn: never;
1073
+ identity: undefined;
1074
+ generated: undefined;
1075
+ }, {}>;
1076
+ createdBy: drizzle_orm_mssql_core.MsSqlColumn<{
1077
+ name: string;
1078
+ tableName: "DailyReportUserStatus";
1079
+ dataType: "string";
1080
+ data: string;
1081
+ driverParam: string | number;
1082
+ notNull: true;
1083
+ hasDefault: false;
1084
+ isPrimaryKey: false;
1085
+ isAutoincrement: false;
1086
+ hasRuntimeDefault: false;
1087
+ enumValues: [string, ...string[]];
1088
+ baseColumn: never;
1089
+ identity: undefined;
1090
+ generated: undefined;
1091
+ }, {}>;
1092
+ updatedAt: drizzle_orm_mssql_core.MsSqlColumn<{
1093
+ name: string;
1094
+ tableName: "DailyReportUserStatus";
1095
+ dataType: "object date";
1096
+ data: Date;
1097
+ driverParam: string | Date;
1098
+ notNull: true;
1099
+ hasDefault: false;
1100
+ isPrimaryKey: false;
1101
+ isAutoincrement: false;
1102
+ hasRuntimeDefault: false;
1103
+ enumValues: undefined;
1104
+ baseColumn: never;
1105
+ identity: undefined;
1106
+ generated: undefined;
1107
+ }, {}>;
1108
+ updatedBy: drizzle_orm_mssql_core.MsSqlColumn<{
1109
+ name: string;
1110
+ tableName: "DailyReportUserStatus";
1111
+ dataType: "string";
1112
+ data: string;
1113
+ driverParam: string | number;
1114
+ notNull: true;
1115
+ hasDefault: false;
1116
+ isPrimaryKey: false;
1117
+ isAutoincrement: false;
1118
+ hasRuntimeDefault: false;
1119
+ enumValues: [string, ...string[]];
1120
+ baseColumn: never;
1121
+ identity: undefined;
1122
+ generated: undefined;
1123
+ }, {}>;
1124
+ };
1125
+ dialect: "mssql";
1126
+ }>;
1127
+ };
1128
+
1129
+ /** DailyReportHub の行型。 */
1130
+ type DailyReportHubRow = {
1131
+ id: number;
1132
+ sourceType: string;
1133
+ sourceId: string;
1134
+ sourceIdNum: number | null;
1135
+ businessDate: Date | string | null;
1136
+ userId: number | null;
1137
+ title: string | null;
1138
+ summary: string | null;
1139
+ createdAt: Date | string;
1140
+ createdBy: string;
1141
+ updatedAt: Date | string;
1142
+ updatedBy: string;
1143
+ deletedAt: Date | string | null;
1144
+ deletedBy: string | null;
1145
+ };
1146
+ /** DailyReportInternal の行型。 */
1147
+ type DailyReportInternalRow = {
1148
+ hubId: number;
1149
+ body: string | null;
1150
+ metadata: string | null;
1151
+ createdAt: Date | string;
1152
+ createdBy: string;
1153
+ updatedAt: Date | string;
1154
+ updatedBy: string;
1155
+ };
1156
+ /** DailyReportUserStatus の行型。 */
1157
+ type DailyReportUserStatusRow = {
1158
+ hubId: number;
1159
+ userId: number;
1160
+ isRead: boolean;
1161
+ isStarred: boolean;
1162
+ createdAt: Date | string;
1163
+ createdBy: string;
1164
+ updatedAt: Date | string;
1165
+ updatedBy: string;
1166
+ };
1167
+ /** DailyReportComment の行型。 */
1168
+ type DailyReportCommentRow = {
1169
+ id: number;
1170
+ hubId: number;
1171
+ userId: number;
1172
+ body: string;
1173
+ createdAt: Date | string;
1174
+ createdBy: string;
1175
+ updatedAt: Date | string;
1176
+ updatedBy: string;
1177
+ };
1178
+ type Rows<T> = PromiseLike<T[]>;
1179
+ interface SelectChain<T> extends Rows<T> {
1180
+ from(t: unknown): SelectChain<T>;
1181
+ innerJoin(t: unknown, on: unknown): SelectChain<T>;
1182
+ leftJoin(t: unknown, on: unknown): SelectChain<T>;
1183
+ where(cond: unknown): SelectChain<T>;
1184
+ orderBy(...cols: unknown[]): SelectChain<T>;
1185
+ top(n: number): SelectChain<T>;
1186
+ }
1187
+ interface InsertChain<T> {
1188
+ output(): {
1189
+ values(v: unknown): PromiseLike<T[]>;
1190
+ };
1191
+ values(v: unknown): PromiseLike<unknown>;
1192
+ }
1193
+ interface UpdateChain<T> {
1194
+ set(v: unknown): {
1195
+ where(cond: unknown): PromiseLike<unknown>;
1196
+ output(): {
1197
+ where(cond: unknown): PromiseLike<T[]>;
1198
+ };
1199
+ };
1200
+ }
1201
+ interface DeleteChain {
1202
+ where(cond: unknown): PromiseLike<unknown>;
1203
+ }
1204
+ /** サービスが要求する drizzle mssql データベースの最小面 (トランザクション込み)。 */
1205
+ interface DailyReportDb {
1206
+ select<T = Record<string, unknown>>(fields?: unknown): SelectChain<T>;
1207
+ insert<T = Record<string, unknown>>(t: unknown): InsertChain<T>;
1208
+ update<T = Record<string, unknown>>(t: unknown): UpdateChain<T>;
1209
+ delete(t: unknown): DeleteChain;
1210
+ transaction<T>(fn: (tx: DailyReportDb) => Promise<T>, config?: unknown): Promise<T>;
1211
+ }
1212
+ type DailyReportServiceConfig = {
1213
+ /** drizzle mssql データベースハンドル。 */
1214
+ db: DailyReportDb;
1215
+ /** 日報 6 テーブル (アプリ既存モデルまたは defineDailyReportSchema 生成物)。 */
1216
+ tables: DailyReportTables;
1217
+ /** 表示名解決に使う外部ユーザーテーブル ({ id, displayName })。 */
1218
+ userTable: DailyReportUserTable;
1219
+ /** 外部ユーザー ID → 内部数値 ID の解決ポート。 */
1220
+ resolveUserId: DailyReportResolveUserId;
1221
+ /** 内部数値 ID の難読化ポート。 */
1222
+ encodeUserId: DailyReportEncodeUserId;
1223
+ /** SSE publish / epoch 用 redis (省略時は SSE publish スキップ・epoch 無効)。 */
1224
+ redis?: DailyReportRedisProvider;
1225
+ /** レガシー等の外部ソースアダプタ群。 */
1226
+ externalSources?: DailyReportExternalSource[];
1227
+ /** SQL 結果キャッシュ (facade が生成して注入)。 */
1228
+ cache: SqlResultCache;
1229
+ /** クロスワーカー epoch ストア (facade が生成して注入)。 */
1230
+ epochs: EpochStore;
1231
+ /**
1232
+ * 下書きラベル名 (必須)。ドラフトのクロスユーザー可視性フィルタに使うため、
1233
+ * サイレントな既定値を持たせず消費アプリが自 DB のラベル名を必ず注入する。
1234
+ */
1235
+ draftLabelName: string;
1236
+ /** SSE Redis Stream キー (既定 "daily-report:sse-stream")。 */
1237
+ streamKey?: string;
1238
+ /** SSE Stream の MAXLEN (既定 10000)。 */
1239
+ streamMaxLen?: number;
1240
+ /** IDs 一覧キャッシュ TTL (既定 180,000ms)。 */
1241
+ idsTtlMs?: number;
1242
+ /** 営業日別キャッシュ TTL (既定 300,000ms)。 */
1243
+ businessDateTtlMs?: number;
1244
+ /** 外部 ID → 内部 ID のプロセス内キャッシュを無効化 (テスト用)。 */
1245
+ disableUserIdCache?: boolean;
1246
+ /** ロガー (既定は console ベース)。 */
1247
+ logger?: DailyReportLogger;
1248
+ };
1249
+ /** createDailyReportService の返却型。 */
1250
+ type DailyReportService = ReturnType<typeof createDailyReportService>;
1251
+ /**
1252
+ * Creates the daily-report data-access service bound to the injected dependencies.
1253
+ * 注入された依存に束縛された日報データアクセスサービスを生成する処理。
1254
+ */
1255
+ declare function createDailyReportService(config: DailyReportServiceConfig): {
1256
+ streamKey: string;
1257
+ streamMaxLen: number;
1258
+ getUserIdByExternalId: (externalId: string) => Promise<number | null>;
1259
+ getDailyReportIdsByExternalId: (externalId: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportItem[]>;
1260
+ getDailyReportsByBusinessDate: (businessDate: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail[]>;
1261
+ getDailyReportsByBusinessDateByExternalId: (businessDate: string, externalId: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail[]>;
1262
+ getDailyReportDetailById: (reportHubId: number, userId: number, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail | null>;
1263
+ getDailyReportDetailByIdByExternalId: (reportHubId: number, externalId: string, options?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail | null>;
1264
+ getDraftLabelId: () => Promise<number | null>;
1265
+ setStarStatus: (userId: number, reportHubId: number, businessDate: string | null, isStarred: boolean, clientTempId: string) => Promise<DailyReportUserStatusRow>;
1266
+ setReadStatus: (userId: number, reportHubId: number, businessDate: string | null, isRead: boolean, clientTempId: string) => Promise<DailyReportUserStatusRow>;
1267
+ addComment: (userId: number, reportHubId: number, content: string, businessDate: string | null, clientTempId: string) => Promise<DailyReportCommentItem>;
1268
+ deleteComment: (userId: number, reportHubId: number, commentId: number, businessDate: string | null, clientTempId: string) => Promise<void>;
1269
+ createDailyReport: (userId: number, businessDate: string, clientTempId: string) => Promise<DailyReportDetail>;
1270
+ updateDailyReport: (reportHubId: number, userId: number, data: {
1271
+ title?: string;
1272
+ content?: string;
1273
+ }, clientTempId: string) => Promise<void>;
1274
+ publishDailyReport: (reportHubId: number, userId: number, clientTempId: string) => Promise<DailyReportDetail | null>;
1275
+ deleteDailyReport: (reportHubId: number, userId: number, clientTempId: string) => Promise<void>;
1276
+ findDailyReportHubById: (tx: DailyReportDb, reportHubId: number) => Promise<DailyReportHubRow[]>;
1277
+ updateDailyReportHub: (tx: DailyReportDb, reportHubId: number, data: Partial<DailyReportHubRow>) => Promise<void>;
1278
+ updateDailyReportInternal: (tx: DailyReportDb, hubId: number, data: Partial<DailyReportInternalRow>) => Promise<void>;
1279
+ deleteDailyReportLabel: (tx: DailyReportDb, hubId: number, labelId: number) => Promise<void>;
1280
+ };
1281
+
1282
+ /**
1283
+ * Fan-Out shared reader for the daily report SSE Redis Stream.
1284
+ * 日報 SSE 用 Redis Stream の共有リーダーモジュール。
1285
+ *
1286
+ * 単一の xRead BLOCK ループで全接続にメッセージをブロードキャストし、
1287
+ * 接続ごとに Redis TCP を張る問題を解消する。
1288
+ */
1289
+
1290
+ /**
1291
+ * Compares two Redis Stream IDs numerically.
1292
+ * Redis Stream ID を数値比較し、a <= b なら true を返す。
1293
+ *
1294
+ * Stream ID は `<timestamp_ms>-<sequence>` 形式。
1295
+ * 辞書順比較では sequence が可変長のとき不正確になるため、数値分割で比較する。
1296
+ */
1297
+ declare const isStreamIdLte: (a: string, b: string) => boolean;
1298
+ /** xRead 結果の 1 エントリに相当する型。 */
1299
+ type StreamEntry = {
1300
+ id: string;
1301
+ message: Record<string, string>;
1302
+ };
1303
+ type DailyReportSseReaderConfig = {
1304
+ /** ブロッキング xRead 用の専用クライアントを生成する redis プロバイダー。 */
1305
+ redis?: DailyReportRedisProvider;
1306
+ /** SSE Redis Stream キー。 */
1307
+ streamKey: string;
1308
+ /** 受信メッセージに応じてローカル SQL キャッシュを無効化する対象キャッシュ。 */
1309
+ cache: SqlResultCache;
1310
+ /** ロガー (既定は console ベース)。 */
1311
+ logger?: DailyReportLogger;
1312
+ };
1313
+ /**
1314
+ * Shared xRead loop that fans out entries to all active SSE connections.
1315
+ * 全 SSE 接続に対してメッセージをファンアウトする共有 xRead ループ。
1316
+ *
1317
+ * - "entry" イベント: 新着エントリ (StreamEntry) をブロードキャスト
1318
+ * - "error" イベント: 回復不能エラーをブロードキャスト
1319
+ * */
1320
+ declare class DailyReportSseReader {
1321
+ private readonly config;
1322
+ private _emitter;
1323
+ private _state;
1324
+ private _refCount;
1325
+ private _lastId;
1326
+ private _client;
1327
+ private readonly _logger;
1328
+ constructor(config: DailyReportSseReaderConfig);
1329
+ /**
1330
+ * Subscribes to the shared reader. Starts the loop on first subscriber.
1331
+ * 共有リーダーを購読する。最初の購読者でループを開始する。
1332
+ *
1333
+ * @param onEntry - 新着エントリのコールバック
1334
+ * @param onError - 回復不能エラーのコールバック (省略可)
1335
+ * @returns unsubscribe 関数。呼び出すと両リスナーを解除し、最後の購読者解除でループを停止する。
1336
+ */
1337
+ subscribe(onEntry: (entry: StreamEntry) => void, onError?: (err: Error) => void): () => void;
1338
+ /**
1339
+ * Destroys the reader for test cleanup.
1340
+ * テストクリーンアップ用のデストラクタ。
1341
+ */
1342
+ destroy(): Promise<void>;
1343
+ /**
1344
+ * Internal xRead BLOCK loop.
1345
+ * 内部 xRead BLOCK ループ。
1346
+ */
1347
+ private _startLoop;
1348
+ /**
1349
+ * Stops the xRead loop by closing the client.
1350
+ * クライアントを閉じて xRead ループを停止する。
1351
+ */
1352
+ private _stopLoop;
1353
+ }
1354
+
1355
+ /**
1356
+ * Generates a SHA-256 ETag for the given data.
1357
+ * 指定されたデータの SHA-256 ETag を生成します。
1358
+ *
1359
+ * @param data The data to hash (will be JSON stringified).
1360
+ * @returns The ETag string (wrapped in quotes).
1361
+ */
1362
+ declare const generateETag: (data: unknown) => string;
1363
+
1364
+ type LoaderArgs = {
1365
+ request: Request;
1366
+ params: Record<string, string | undefined>;
1367
+ };
1368
+ type DailyReportHandlersConfig = {
1369
+ /** リクエスト認証ポート。 */
1370
+ authenticate: DailyReportAuthenticate;
1371
+ /** データアクセスサービス。 */
1372
+ service: DailyReportService;
1373
+ /** 内部数値 ID の難読化ポート。 */
1374
+ encodeUserId: DailyReportEncodeUserId;
1375
+ /** SSE 用 redis プロバイダー (catch-up の xRange / xRevRange に使用)。 */
1376
+ redis?: DailyReportRedisProvider;
1377
+ /** SSE Fan-Out 共有リーダー。 */
1378
+ sseReader: DailyReportSseReader;
1379
+ /** SSE Redis Stream キー。 */
1380
+ streamKey: string;
1381
+ /** 未ログイン時のリダイレクト先 (index.loader 用、既定 "/auth/login")。 */
1382
+ loginRedirectPath?: string;
1383
+ /** ロガー (既定は console ベース)。 */
1384
+ logger?: DailyReportLogger;
1385
+ };
1386
+ /**
1387
+ * Creates the daily-report loaders/actions bound to the injected dependencies.
1388
+ * 注入依存に束縛された日報 loader / action 群を生成する処理。
1389
+ */
1390
+ declare function createDailyReportHandlers(config: DailyReportHandlersConfig): {
1391
+ index: {
1392
+ loader: ({ request }: LoaderArgs) => Promise<{
1393
+ data: {
1394
+ user: {
1395
+ id: string;
1396
+ } | undefined;
1397
+ userId: string | null;
1398
+ };
1399
+ headers: Headers;
1400
+ }>;
1401
+ };
1402
+ api: {
1403
+ loader: ({ request, params }: LoaderArgs) => Promise<Response>;
1404
+ action: ({ request, params }: LoaderArgs) => Promise<Response>;
1405
+ };
1406
+ sse: {
1407
+ loader: ({ request, params }: LoaderArgs) => Promise<Response>;
1408
+ };
1409
+ };
1410
+
1411
+ /**
1412
+ * JSON response helper with shared security headers and ETag support.
1413
+ * 共有セキュリティヘッダーと ETag 対応を備えた JSON レスポンスヘルパー。
1414
+ */
1415
+
1416
+ /**
1417
+ * Creates JSON response with shared security headers and ETag support.
1418
+ * 共有のセキュリティヘッダーと ETag サポート付き JSON レスポンスを生成。
1419
+ */
1420
+ declare const jsonResponseWithETag: (request: Request, cookie: string | null, payload: Record<string, unknown>, status?: number, logger?: DailyReportLogger) => Response;
1421
+
1422
+ /** createDailyReportServer の設定 (サービス設定 + 認証ポート + ハンドラ設定)。 */
1423
+ type DailyReportServerConfig = Omit<DailyReportServiceConfig, "cache" | "epochs"> & {
1424
+ /** リクエスト認証ポート。 */
1425
+ authenticate: DailyReportAuthenticate;
1426
+ /** 未ログイン時のリダイレクト先 (index.loader 用、既定 "/auth/login")。 */
1427
+ loginRedirectPath?: string;
1428
+ /** SQL 結果キャッシュの既定 TTL (既定 60,000ms)。 */
1429
+ cacheDefaultTtlMs?: number;
1430
+ /** 外部ソースアダプタ群 (レガシー日報テーブル等)。 */
1431
+ externalSources?: DailyReportExternalSource[];
1432
+ };
1433
+ /**
1434
+ * One-stop factory wiring cache, service, SSE fan-out reader, and route handlers.
1435
+ * キャッシュ・サービス・SSE Fan-Out リーダー・ルートハンドラを一括結線するファクトリ。
1436
+ *
1437
+ * @example
1438
+ * const server = createDailyReportServer({ db, tables, userTable, resolveUserId, encodeUserId, authenticate, redis })
1439
+ * // routes:
1440
+ * // daily_report._index → server.index.loader (+ data() ラップ)
1441
+ * // daily_report.api.$endpoint → server.api.loader / server.api.action
1442
+ * // sse.daily_report.$endpoint → server.sse.loader
1443
+ */
1444
+ declare function createDailyReportServer(config: DailyReportServerConfig): {
1445
+ index: {
1446
+ loader: ({ request }: {
1447
+ request: Request;
1448
+ params: Record<string, string | undefined>;
1449
+ }) => Promise<{
1450
+ data: {
1451
+ user: {
1452
+ id: string;
1453
+ } | undefined;
1454
+ userId: string | null;
1455
+ };
1456
+ headers: Headers;
1457
+ }>;
1458
+ };
1459
+ api: {
1460
+ loader: ({ request, params }: {
1461
+ request: Request;
1462
+ params: Record<string, string | undefined>;
1463
+ }) => Promise<Response>;
1464
+ action: ({ request, params }: {
1465
+ request: Request;
1466
+ params: Record<string, string | undefined>;
1467
+ }) => Promise<Response>;
1468
+ };
1469
+ sse: {
1470
+ loader: ({ request, params }: {
1471
+ request: Request;
1472
+ params: Record<string, string | undefined>;
1473
+ }) => Promise<Response>;
1474
+ };
1475
+ /** データアクセスサービス (CRUD + キャッシュ + SSE publish)。 */
1476
+ service: {
1477
+ streamKey: string;
1478
+ streamMaxLen: number;
1479
+ getUserIdByExternalId: (externalId: string) => Promise<number | null>;
1480
+ getDailyReportIdsByExternalId: (externalId: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportItem[]>;
1481
+ getDailyReportsByBusinessDate: (businessDate: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail[]>;
1482
+ getDailyReportsByBusinessDateByExternalId: (businessDate: string, externalId: string, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail[]>;
1483
+ getDailyReportDetailById: (reportHubId: number, userId: number, { forceRefresh, snapshot, ttlMsOverride }?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail | null>;
1484
+ getDailyReportDetailByIdByExternalId: (reportHubId: number, externalId: string, options?: SqlResultCacheQueryOptions) => Promise<DailyReportDetail | null>;
1485
+ getDraftLabelId: () => Promise<number | null>;
1486
+ setStarStatus: (userId: number, reportHubId: number, businessDate: string | null, isStarred: boolean, clientTempId: string) => Promise<DailyReportUserStatusRow>;
1487
+ setReadStatus: (userId: number, reportHubId: number, businessDate: string | null, isRead: boolean, clientTempId: string) => Promise<DailyReportUserStatusRow>;
1488
+ addComment: (userId: number, reportHubId: number, content: string, businessDate: string | null, clientTempId: string) => Promise<DailyReportCommentItem>;
1489
+ deleteComment: (userId: number, reportHubId: number, commentId: number, businessDate: string | null, clientTempId: string) => Promise<void>;
1490
+ createDailyReport: (userId: number, businessDate: string, clientTempId: string) => Promise<DailyReportDetail>;
1491
+ updateDailyReport: (reportHubId: number, userId: number, data: {
1492
+ title?: string;
1493
+ content?: string;
1494
+ }, clientTempId: string) => Promise<void>;
1495
+ publishDailyReport: (reportHubId: number, userId: number, clientTempId: string) => Promise<DailyReportDetail | null>;
1496
+ deleteDailyReport: (reportHubId: number, userId: number, clientTempId: string) => Promise<void>;
1497
+ findDailyReportHubById: (tx: DailyReportDb, reportHubId: number) => Promise<DailyReportHubRow[]>;
1498
+ updateDailyReportHub: (tx: DailyReportDb, reportHubId: number, data: Partial<DailyReportHubRow>) => Promise<void>;
1499
+ updateDailyReportInternal: (tx: DailyReportDb, hubId: number, data: Partial<DailyReportInternalRow>) => Promise<void>;
1500
+ deleteDailyReportLabel: (tx: DailyReportDb, hubId: number, labelId: number) => Promise<void>;
1501
+ };
1502
+ /** SQL 結果キャッシュ (サービス・SSE リーダー共有インスタンス)。 */
1503
+ cache: SqlResultCache;
1504
+ /** クロスワーカー epoch ストア。 */
1505
+ epochs: {
1506
+ getEpoch(epochKey: string): Promise<number>;
1507
+ incrementEpoch(epochKey: string): Promise<void>;
1508
+ };
1509
+ /** SSE Fan-Out 共有リーダー。 */
1510
+ sseReader: DailyReportSseReader;
1511
+ /** SSE Redis Stream キー。 */
1512
+ streamKey: string;
1513
+ };
1514
+
1515
+ export { type DailyReportAuthResult, type DailyReportAuthenticate, type DailyReportCommentRow, type DailyReportCommentTable, type DailyReportDb, type DailyReportEncodeUserId, type DailyReportExternalSource, type DailyReportHandlersConfig, type DailyReportHubLabelTable, type DailyReportHubRow, type DailyReportHubTable, type DailyReportInternalRow, type DailyReportInternalTable, type DailyReportLabelTable, type DailyReportRedisBlockingClient, type DailyReportRedisClient, type DailyReportRedisProvider, type DailyReportResolveUserId, type DailyReportServerConfig, type DailyReportService, type DailyReportServiceConfig, DailyReportSseReader, type DailyReportSseReaderConfig, type DailyReportTables, type DailyReportUserStatusRow, type DailyReportUserStatusTable, type DailyReportUserTable, type EpochStore, type ExternalReportFields, type RedisStreamMessage, SqlResultCache, type SqlResultCacheQueryOptions, type StreamEntry, createDailyReportHandlers, createDailyReportServer, createDailyReportService, createEpochStore, defineDailyReportSchema, generateETag, isStreamIdLte, jsonResponseWithETag, transformJsonArray };