hazo_notes 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/config/hazo_notes_config.ini +48 -0
  2. package/db_setup_postgres.sql +49 -0
  3. package/db_setup_sqlite.sql +22 -0
  4. package/dist/api/create_files_handler.d.ts +1 -1
  5. package/dist/api/create_files_handler.d.ts.map +1 -1
  6. package/dist/api/create_files_handler.js +196 -139
  7. package/dist/api/create_files_handler.js.map +1 -1
  8. package/dist/api/create_notes_handler.d.ts.map +1 -1
  9. package/dist/api/create_notes_handler.js +225 -162
  10. package/dist/api/create_notes_handler.js.map +1 -1
  11. package/dist/components/hazo_notes_entry.js +1 -1
  12. package/dist/components/hazo_notes_entry.js.map +1 -1
  13. package/dist/components/hazo_notes_file_preview.js +1 -1
  14. package/dist/components/hazo_notes_file_preview.js.map +1 -1
  15. package/dist/components/hazo_notes_icon.js +1 -1
  16. package/dist/components/hazo_notes_icon.js.map +1 -1
  17. package/dist/components/hazo_notes_panel.js +1 -1
  18. package/dist/components/hazo_notes_panel.js.map +1 -1
  19. package/dist/components/internal/sheet.js +1 -1
  20. package/dist/components/internal/sheet.js.map +1 -1
  21. package/dist/index.client.d.ts +0 -1
  22. package/dist/index.client.d.ts.map +1 -1
  23. package/dist/index.client.js +2 -2
  24. package/dist/index.client.js.map +1 -1
  25. package/dist/lib/config/hazo_notes_config.d.ts +125 -0
  26. package/dist/lib/config/hazo_notes_config.d.ts.map +1 -0
  27. package/dist/lib/config/hazo_notes_config.js +76 -0
  28. package/dist/lib/config/hazo_notes_config.js.map +1 -0
  29. package/dist/lib/config/index.d.ts +3 -0
  30. package/dist/lib/config/index.d.ts.map +1 -0
  31. package/dist/lib/config/index.js +2 -0
  32. package/dist/lib/config/index.js.map +1 -0
  33. package/dist/lib/config.d.ts +14 -15
  34. package/dist/lib/config.d.ts.map +1 -1
  35. package/dist/lib/config.js +45 -93
  36. package/dist/lib/config.js.map +1 -1
  37. package/dist/lib/index.d.ts +2 -0
  38. package/dist/lib/index.d.ts.map +1 -1
  39. package/dist/lib/index.js +1 -0
  40. package/dist/lib/index.js.map +1 -1
  41. package/dist/logger/server.d.ts +13 -9
  42. package/dist/logger/server.d.ts.map +1 -1
  43. package/dist/logger/server.js +21 -15
  44. package/dist/logger/server.js.map +1 -1
  45. package/dist/logger/types.d.ts +3 -2
  46. package/dist/logger/types.d.ts.map +1 -1
  47. package/dist/logger/types.js +2 -1
  48. package/dist/logger/types.js.map +1 -1
  49. package/dist/utils/index.d.ts +2 -1
  50. package/dist/utils/index.d.ts.map +1 -1
  51. package/dist/utils/index.js +2 -1
  52. package/dist/utils/index.js.map +1 -1
  53. package/package.json +26 -11
  54. package/dist/utils/cn.d.ts +0 -16
  55. package/dist/utils/cn.d.ts.map +0 -1
  56. package/dist/utils/cn.js +0 -19
  57. package/dist/utils/cn.js.map +0 -1
  58. package/migrations/001_create_hazo_notes_table.sql +0 -77
  59. package/migrations/002_grant_api_user_hazo_notes.sql +0 -24
@@ -0,0 +1,48 @@
1
+ # hazo_notes Configuration
2
+ # This file configures the notes system behavior and storage
3
+ #
4
+ # Env-var overrides follow the pattern HAZO_NOTES_<SECTION>_<KEY> (uppercase).
5
+ # Per-env overlays: place hazo_notes_config.<HAZO_ENV>.ini next to this file.
6
+
7
+ [general]
8
+ # Optional override for the deployment environment. Defaults to
9
+ # HAZO_ENV → NODE_ENV → 'development' (resolved by hazo_core).
10
+ # env = production
11
+
12
+ [log.overrides]
13
+ # Per-namespace log level overrides (per D-015). Format:
14
+ # <namespace> = <level>
15
+ # Examples:
16
+ # hazo_notes/poll = warn
17
+ # hazo_notes = debug
18
+
19
+ [ui]
20
+ # Background color for notes panel (Tailwind CSS class)
21
+ background_color = bg-yellow-100
22
+
23
+ # Panel presentation style: popover | slide_panel
24
+ panel_style = popover
25
+
26
+ # Save behavior: explicit (save/cancel buttons) | auto (save on blur)
27
+ save_mode = explicit
28
+
29
+ [storage]
30
+ # File storage mode: jsonb (in database) | filesystem (on server)
31
+ file_storage_mode = jsonb
32
+
33
+ # Path for filesystem storage (only used when file_storage_mode = filesystem)
34
+ file_storage_path = /uploads/notes
35
+
36
+ [files]
37
+ # Maximum file size in MB
38
+ max_file_size_mb = 10
39
+
40
+ # Allowed file types (comma-separated extensions)
41
+ allowed_file_types = pdf,png,jpg,jpeg,gif,doc,docx
42
+
43
+ # Maximum files per single note entry
44
+ max_files_per_note = 5
45
+
46
+ [logging]
47
+ # Log file path
48
+ logfile = logs/hazo_notes.log
@@ -0,0 +1,49 @@
1
+ -- hazo_notes database schema
2
+ -- PostgreSQL -- idempotent (safe to run multiple times)
3
+ -- Run this file to set up all tables required by hazo_notes
4
+ --
5
+ -- Tables: hazo_notes
6
+
7
+ -- ============================================================
8
+ -- hazo_notes
9
+ -- Database-backed notes linked to any entity via ref_id.
10
+ -- Notes are stored as a JSONB array with user attribution and
11
+ -- optional file attachments.
12
+ -- ============================================================
13
+
14
+ CREATE TABLE IF NOT EXISTS hazo_notes (
15
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
16
+ ref_id UUID NOT NULL,
17
+ note JSONB NOT NULL DEFAULT '[]'::jsonb,
18
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
19
+ changed_at TIMESTAMPTZ NULL,
20
+ note_count INTEGER NOT NULL DEFAULT 0
21
+ );
22
+
23
+ CREATE INDEX IF NOT EXISTS idx_hazo_notes_ref_id ON hazo_notes(ref_id);
24
+
25
+ COMMENT ON TABLE hazo_notes IS 'Notes linked to any entity via ref_id. note column is a JSONB array of {userid, created_at, note_text, note_files}.';
26
+ COMMENT ON COLUMN hazo_notes.id IS 'Primary key UUID';
27
+ COMMENT ON COLUMN hazo_notes.ref_id IS 'UUID reference to the parent entity (e.g. form field, document, task)';
28
+ COMMENT ON COLUMN hazo_notes.note IS 'JSONB array of note entries';
29
+ COMMENT ON COLUMN hazo_notes.created_at IS 'Timestamp when the notes row was first created';
30
+ COMMENT ON COLUMN hazo_notes.changed_at IS 'Timestamp of the last modification to the notes';
31
+ COMMENT ON COLUMN hazo_notes.note_count IS 'Denormalised count of notes, kept in sync on write to avoid parsing JSONB on read';
32
+
33
+ -- ============================================================
34
+ -- PostgREST role grants
35
+ -- Required for the bundled API handlers, which talk to PostgREST.
36
+ -- The api_user role must exist beforehand (created by hazo_connect setup).
37
+ -- ============================================================
38
+
39
+ DO $$ BEGIN
40
+ IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'api_user') THEN
41
+ GRANT SELECT, INSERT, UPDATE, DELETE ON hazo_notes TO api_user;
42
+ END IF;
43
+ END $$;
44
+
45
+ -- ============================================================
46
+ -- Notify PostgREST to reload the schema cache
47
+ -- ============================================================
48
+
49
+ SELECT pg_notify('pgrst', 'reload schema');
@@ -0,0 +1,22 @@
1
+ -- hazo_notes database schema
2
+ -- SQLite -- idempotent (safe to run multiple times)
3
+ -- Run this file to set up all tables required by hazo_notes
4
+ --
5
+ -- Tables: hazo_notes
6
+
7
+ -- ============================================================
8
+ -- hazo_notes
9
+ -- Notes linked to any entity via ref_id. The note column is a
10
+ -- JSON-encoded array stored as TEXT (SQLite has no native JSONB).
11
+ -- ============================================================
12
+
13
+ CREATE TABLE IF NOT EXISTS hazo_notes (
14
+ id TEXT PRIMARY KEY,
15
+ ref_id TEXT NOT NULL,
16
+ note TEXT NOT NULL DEFAULT '[]',
17
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
18
+ changed_at TEXT,
19
+ note_count INTEGER NOT NULL DEFAULT 0
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_hazo_notes_ref_id ON hazo_notes(ref_id);
@@ -32,7 +32,7 @@ import type { CreateFilesHandlerOptions, FileUploadApiResponse } from '../types/
32
32
  * @returns Object with POST (upload) and GET (download) handlers
33
33
  */
34
34
  export declare function createFilesHandler(options: CreateFilesHandlerOptions): {
35
- GET: (request: Request, context: {
35
+ GET: (request: Request, _context: {
36
36
  params: Promise<{
37
37
  file_id?: string;
38
38
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"create_files_handler.d.ts","sourceRoot":"","sources":["../../src/api/create_files_handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,yBAAyB,EAEzB,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAkC3B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB;mBAyIxD,OAAO,WACP;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KACjD,OAAO,CAAC,YAAY,CAAC;oBArHK,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;EAuLpF"}
1
+ {"version":3,"file":"create_files_handler.d.ts","sourceRoot":"","sources":["../../src/api/create_files_handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,OAAO,KAAK,EACV,yBAAyB,EAEzB,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAqC3B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB;mBAgKxD,OAAO,YACN;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAClD,OAAO,CAAC,YAAY,CAAC;oBA5IK,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;EA0OpF"}
@@ -24,6 +24,7 @@
24
24
  * ```
25
25
  */
26
26
  import { NextResponse } from 'next/server';
27
+ import { HazoError, HazoAuthError, HazoValidationError, HazoInternalError, HazoNotFoundError, withContext, createLogger, } from 'hazo_core';
27
28
  import { get_mime_type, is_allowed_file_type, generate_file_no, } from '../utils/file_utils.js';
28
29
  // ============================================================================
29
30
  // Constants
@@ -33,17 +34,17 @@ const DEFAULT_ALLOWED_TYPES = ['pdf', 'png', 'jpg', 'jpeg', 'gif', 'doc', 'docx'
33
34
  // ============================================================================
34
35
  // Helper Functions
35
36
  // ============================================================================
36
- /** No-op logger */
37
- const noopLogger = {
38
- error: () => { },
39
- warn: () => { },
40
- info: () => { },
41
- debug: () => { },
42
- };
43
37
  /** Create error response */
44
38
  function createErrorResponse(error, status) {
45
39
  return NextResponse.json({ success: false, error }, { status });
46
40
  }
41
+ function errorResponseFromHazo(err) {
42
+ const status = err.httpStatus ?? 500;
43
+ return NextResponse.json({
44
+ success: false,
45
+ error: err.toUserMessage ? err.toUserMessage() : err.message,
46
+ }, { status });
47
+ }
47
48
  /**
48
49
  * Creates file upload and download handlers
49
50
  *
@@ -52,7 +53,7 @@ function createErrorResponse(error, status) {
52
53
  */
53
54
  export function createFilesHandler(options) {
54
55
  const { getHazoConnect, getLogger, getUserIdFromRequest, file_storage_mode = 'jsonb', file_storage_path = '/uploads/notes', max_file_size_mb = DEFAULT_MAX_FILE_SIZE_MB, allowed_file_types = DEFAULT_ALLOWED_TYPES, } = options;
55
- const logger = getLogger?.() || noopLogger;
56
+ const logger = getLogger ? getLogger() : createLogger('hazo_notes');
56
57
  const max_bytes = max_file_size_mb * 1024 * 1024;
57
58
  /**
58
59
  * POST handler - Upload a file
@@ -63,150 +64,206 @@ export function createFilesHandler(options) {
63
64
  * - embed_type: 'embed' or 'attachment'
64
65
  */
65
66
  async function POST(request) {
66
- try {
67
- // Check authentication
68
- const userId = getUserIdFromRequest
69
- ? await getUserIdFromRequest(request)
70
- : null;
71
- if (!userId) {
72
- return createErrorResponse('Unauthorized', 401);
73
- }
74
- // Parse form data
75
- const formData = await request.formData();
76
- const file = formData.get('file');
77
- const ref_id = formData.get('ref_id');
78
- const embed_type = formData.get('embed_type') || 'attachment';
79
- if (!file) {
80
- return createErrorResponse('No file provided', 400);
81
- }
82
- if (!ref_id) {
83
- return createErrorResponse('ref_id is required', 400);
84
- }
85
- // Validate file type
86
- if (!is_allowed_file_type(file.name, allowed_file_types)) {
87
- return createErrorResponse(`File type not allowed. Allowed types: ${allowed_file_types.join(', ')}`, 400);
88
- }
89
- // Validate file size
90
- if (file.size > max_bytes) {
91
- return createErrorResponse(`File size exceeds maximum of ${max_file_size_mb} MB`, 400);
92
- }
93
- logger.debug('[hazo_notes/files] Upload request', {
94
- filename: file.name,
95
- size: file.size,
96
- ref_id,
97
- embed_type,
98
- storage_mode: file_storage_mode,
99
- });
100
- // Generate file number
101
- const file_no = generate_file_no([]);
102
- let filedata;
103
- if (file_storage_mode === 'filesystem') {
104
- // Filesystem storage - save to disk and store path
105
- try {
106
- const fs = await import('fs/promises');
107
- const path = await import('path');
108
- // Create directory if it doesn't exist
109
- const upload_dir = path.join(process.cwd(), file_storage_path, ref_id);
110
- await fs.mkdir(upload_dir, { recursive: true });
111
- // Save file
112
- const safe_filename = `${file_no}_${file.name.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
113
- const file_path = path.join(upload_dir, safe_filename);
114
- const buffer = Buffer.from(await file.arrayBuffer());
115
- await fs.writeFile(file_path, buffer);
116
- // Store relative path
117
- filedata = `${file_storage_path}/${ref_id}/${safe_filename}`;
118
- logger.debug('[hazo_notes/files] File saved to filesystem', { path: filedata });
67
+ return withContext({}, async () => {
68
+ try {
69
+ const userId = getUserIdFromRequest
70
+ ? await getUserIdFromRequest(request)
71
+ : null;
72
+ if (!userId) {
73
+ throw new HazoAuthError({
74
+ pkg: 'hazo_notes',
75
+ code: 'HAZO_NOTES_UNAUTHORIZED',
76
+ message: 'Unauthorized',
77
+ });
78
+ }
79
+ const formData = await request.formData();
80
+ const file = formData.get('file');
81
+ const ref_id = formData.get('ref_id');
82
+ const embed_type = formData.get('embed_type') || 'attachment';
83
+ if (!file) {
84
+ throw new HazoValidationError({
85
+ pkg: 'hazo_notes',
86
+ code: 'HAZO_NOTES_VALIDATION_ERROR',
87
+ message: 'No file provided',
88
+ context: { field: 'file' },
89
+ });
119
90
  }
120
- catch (error) {
121
- logger.error('[hazo_notes/files] Filesystem write error', {
122
- error: error instanceof Error ? error.message : String(error),
91
+ if (!ref_id) {
92
+ throw new HazoValidationError({
93
+ pkg: 'hazo_notes',
94
+ code: 'HAZO_NOTES_VALIDATION_ERROR',
95
+ message: 'ref_id is required',
96
+ context: { field: 'ref_id' },
123
97
  });
124
- return createErrorResponse('Failed to save file', 500);
125
98
  }
99
+ if (!is_allowed_file_type(file.name, allowed_file_types)) {
100
+ throw new HazoValidationError({
101
+ pkg: 'hazo_notes',
102
+ code: 'HAZO_NOTES_UNSUPPORTED_TYPE',
103
+ message: `File type not allowed. Allowed types: ${allowed_file_types.join(', ')}`,
104
+ context: { filename: file.name, allowed: allowed_file_types },
105
+ });
106
+ }
107
+ if (file.size > max_bytes) {
108
+ throw new HazoValidationError({
109
+ pkg: 'hazo_notes',
110
+ code: 'HAZO_NOTES_FILE_TOO_LARGE',
111
+ message: `File size exceeds maximum of ${max_file_size_mb} MB`,
112
+ context: { size: file.size, max_bytes },
113
+ });
114
+ }
115
+ logger.debug('notes.files.upload.request', {
116
+ filename: file.name,
117
+ size: file.size,
118
+ ref_id,
119
+ embed_type,
120
+ storage_mode: file_storage_mode,
121
+ });
122
+ const file_no = generate_file_no([]);
123
+ let filedata;
124
+ if (file_storage_mode === 'filesystem') {
125
+ try {
126
+ const fs = await import('fs/promises');
127
+ const path = await import('path');
128
+ const upload_dir = path.join(process.cwd(), file_storage_path, ref_id);
129
+ await fs.mkdir(upload_dir, { recursive: true });
130
+ const safe_filename = `${file_no}_${file.name.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
131
+ const file_path = path.join(upload_dir, safe_filename);
132
+ const buffer = Buffer.from(await file.arrayBuffer());
133
+ await fs.writeFile(file_path, buffer);
134
+ filedata = `${file_storage_path}/${ref_id}/${safe_filename}`;
135
+ logger.debug('notes.files.saved', { path: filedata });
136
+ }
137
+ catch (cause) {
138
+ throw new HazoInternalError({
139
+ pkg: 'hazo_notes',
140
+ code: 'HAZO_NOTES_STORAGE_FAILED',
141
+ message: 'Failed to save file',
142
+ cause: cause instanceof Error ? cause : new Error(String(cause)),
143
+ });
144
+ }
145
+ }
146
+ else {
147
+ const buffer = await file.arrayBuffer();
148
+ filedata = Buffer.from(buffer).toString('base64');
149
+ }
150
+ const note_file = {
151
+ file_no,
152
+ embed_type,
153
+ filename: file.name,
154
+ filedata,
155
+ mime_type: get_mime_type(file.name),
156
+ file_size: file.size,
157
+ };
158
+ logger.info('notes.files.uploaded', {
159
+ ref_id,
160
+ file_no,
161
+ storage_mode: file_storage_mode,
162
+ });
163
+ return NextResponse.json({
164
+ success: true,
165
+ file: note_file,
166
+ });
126
167
  }
127
- else {
128
- // JSONB storage - convert to base64
129
- const buffer = await file.arrayBuffer();
130
- filedata = Buffer.from(buffer).toString('base64');
168
+ catch (error) {
169
+ if (HazoError.is(error)) {
170
+ const hazo = error;
171
+ if (hazo.httpStatus && hazo.httpStatus < 500) {
172
+ logger.warn('notes.files.upload.client_error', { code: hazo.code, message: hazo.message });
173
+ }
174
+ else {
175
+ logger.error('notes.files.upload.error', { code: hazo.code, message: hazo.message });
176
+ }
177
+ return errorResponseFromHazo(hazo);
178
+ }
179
+ logger.error('notes.files.upload.error', {
180
+ error: error instanceof Error ? error.message : String(error),
181
+ });
182
+ return createErrorResponse('Failed to upload file', 500);
131
183
  }
132
- const note_file = {
133
- file_no,
134
- embed_type,
135
- filename: file.name,
136
- filedata,
137
- mime_type: get_mime_type(file.name),
138
- file_size: file.size,
139
- };
140
- return NextResponse.json({
141
- success: true,
142
- file: note_file,
143
- });
144
- }
145
- catch (error) {
146
- logger.error('[hazo_notes/files] Upload error', {
147
- error: error instanceof Error ? error.message : String(error),
148
- });
149
- return createErrorResponse('Failed to upload file', 500);
150
- }
184
+ });
151
185
  }
152
186
  /**
153
187
  * GET handler - Download a file (for filesystem storage mode)
154
- *
155
- * Query params:
156
- * - ref_id: Reference ID
157
- * - file_no: File number
158
188
  */
159
- async function GET(request, context) {
160
- try {
161
- if (file_storage_mode !== 'filesystem') {
162
- return createErrorResponse('File download only available for filesystem storage mode', 400);
163
- }
164
- const url = new URL(request.url);
165
- const ref_id = url.searchParams.get('ref_id');
166
- const file_no = url.searchParams.get('file_no');
167
- if (!ref_id || !file_no) {
168
- return createErrorResponse('ref_id and file_no are required', 400);
169
- }
170
- // Get notes to find the file
171
- const hazoConnect = await getHazoConnect();
172
- const result = await hazoConnect.rawQuery(`/hazo_notes?ref_id=eq.${ref_id}`);
173
- if (!result || result.length === 0) {
174
- return createErrorResponse('Notes not found', 404);
175
- }
176
- // Find the file in notes
177
- const notes = result[0].note || [];
178
- let file_info = null;
179
- for (const note of notes) {
180
- if (note.note_files) {
181
- const found = note.note_files.find((f) => f.file_no === file_no);
182
- if (found) {
183
- file_info = found;
184
- break;
189
+ async function GET(request, _context) {
190
+ return withContext({}, async () => {
191
+ try {
192
+ if (file_storage_mode !== 'filesystem') {
193
+ throw new HazoValidationError({
194
+ pkg: 'hazo_notes',
195
+ code: 'HAZO_NOTES_VALIDATION_ERROR',
196
+ message: 'File download only available for filesystem storage mode',
197
+ });
198
+ }
199
+ const url = new URL(request.url);
200
+ const ref_id = url.searchParams.get('ref_id');
201
+ const file_no = url.searchParams.get('file_no');
202
+ if (!ref_id || !file_no) {
203
+ throw new HazoValidationError({
204
+ pkg: 'hazo_notes',
205
+ code: 'HAZO_NOTES_VALIDATION_ERROR',
206
+ message: 'ref_id and file_no are required',
207
+ });
208
+ }
209
+ const hazoConnect = await getHazoConnect();
210
+ const result = await hazoConnect.rawQuery(`/hazo_notes?ref_id=eq.${ref_id}`);
211
+ if (!result || result.length === 0) {
212
+ throw new HazoNotFoundError({
213
+ pkg: 'hazo_notes',
214
+ code: 'HAZO_NOTES_NOTE_NOT_FOUND',
215
+ message: 'Notes not found',
216
+ context: { ref_id },
217
+ });
218
+ }
219
+ const notes = result[0].note || [];
220
+ let file_info = null;
221
+ for (const note of notes) {
222
+ if (note.note_files) {
223
+ const found = note.note_files.find((f) => f.file_no === file_no);
224
+ if (found) {
225
+ file_info = found;
226
+ break;
227
+ }
185
228
  }
186
229
  }
230
+ if (!file_info) {
231
+ throw new HazoNotFoundError({
232
+ pkg: 'hazo_notes',
233
+ code: 'HAZO_NOTES_FILE_NOT_FOUND',
234
+ message: 'File not found',
235
+ context: { ref_id, file_no },
236
+ });
237
+ }
238
+ const fs = await import('fs/promises');
239
+ const path = await import('path');
240
+ const file_path = path.join(process.cwd(), file_info.filedata);
241
+ const buffer = await fs.readFile(file_path);
242
+ return new NextResponse(buffer, {
243
+ headers: {
244
+ 'Content-Type': file_info.mime_type || 'application/octet-stream',
245
+ 'Content-Disposition': `attachment; filename="${file_info.filename}"`,
246
+ 'Content-Length': String(buffer.length),
247
+ },
248
+ });
187
249
  }
188
- if (!file_info) {
189
- return createErrorResponse('File not found', 404);
250
+ catch (error) {
251
+ if (HazoError.is(error)) {
252
+ const hazo = error;
253
+ if (hazo.httpStatus && hazo.httpStatus < 500) {
254
+ logger.warn('notes.files.download.client_error', { code: hazo.code, message: hazo.message });
255
+ }
256
+ else {
257
+ logger.error('notes.files.download.error', { code: hazo.code, message: hazo.message });
258
+ }
259
+ return NextResponse.json({ success: false, error: hazo.toUserMessage ? hazo.toUserMessage() : hazo.message }, { status: hazo.httpStatus ?? 500 });
260
+ }
261
+ logger.error('notes.files.download.error', {
262
+ error: error instanceof Error ? error.message : String(error),
263
+ });
264
+ return createErrorResponse('Failed to download file', 500);
190
265
  }
191
- // Read file from filesystem
192
- const fs = await import('fs/promises');
193
- const path = await import('path');
194
- const file_path = path.join(process.cwd(), file_info.filedata);
195
- const buffer = await fs.readFile(file_path);
196
- return new NextResponse(buffer, {
197
- headers: {
198
- 'Content-Type': file_info.mime_type || 'application/octet-stream',
199
- 'Content-Disposition': `attachment; filename="${file_info.filename}"`,
200
- 'Content-Length': String(buffer.length),
201
- },
202
- });
203
- }
204
- catch (error) {
205
- logger.error('[hazo_notes/files] Download error', {
206
- error: error instanceof Error ? error.message : String(error),
207
- });
208
- return createErrorResponse('Failed to download file', 500);
209
- }
266
+ });
210
267
  }
211
268
  return { GET, POST };
212
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create_files_handler.js","sourceRoot":"","sources":["../../src/api/create_files_handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create_files_handler.js","sourceRoot":"","sources":["../../src/api/create_files_handler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create_notes_handler.d.ts","sourceRoot":"","sources":["../../src/api/create_notes_handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,yBAAyB,EAKzB,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AAiD3B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB;mBAmCxD,OAAO,WACP;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;oBA4E/B,OAAO,WACP;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;EAkJ7C"}
1
+ {"version":3,"file":"create_notes_handler.d.ts","sourceRoot":"","sources":["../../src/api/create_notes_handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,OAAO,KAAK,EACV,yBAAyB,EAKzB,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,mBAAmB,CAAC;AA2D3B;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB;mBAgCxD,OAAO,WACP;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;oBAmG/B,OAAO,WACP;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAC/C,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;EAsK7C"}